+\documentclass{beamer}
+
+\usepackage{beamerthemesplit}
+\usepackage[latin1]{inputenc}
+\usepackage[french]{babel}
+\usepackage{pstricks} % Advanced drawings
+\usepackage{fancyhdr} % Headers
+\usepackage{epsf}
+\usepackage{graphicx}
+\usepackage{fancyhdr}
+
+\title{OpenWrt : fresh air for (wlan) routers}
+
+\author{Florian Fainelli \\
+florian@openwrt.org}
+
+\institute{Rencontres Mondiales du Logiciel Libre 2006 \\
+Vandoeuvre-lès-Nancy\\
+Durée : 30 minutes}
+
+\date[]{Jeudi 6 Juillet 2006}
+
+\begin{document}
+
+\frame{\titlepage}
+\frame[allowframebreaks]
+{
+\frametitle{Sommaire}
+\tableofcontents
+}
+
+\section{Introduction}
+\subsection{Qu'est-ce qu'OpenWrt}
+\frame
+{
+\frametitle{Qu'est-ce qu'OpenWrt}
+\begin{itemize}
+\item contraction d'Opensource Wireless Technology
+\item distribution GNU/Linux minimaliste sous licence GPL
+\item ensemble de fichiers Makefile permettant de construire un système complet
+\item dépôt de paquetages et de mises à jour
+\end{itemize}
+}
+
+\subsection{Historique du projet}
+\frame
+{
+\frametitle{Historique du projet}
+\begin{itemize}
+\item OpenWrt a été crée à l'initiative de Gerry Rozema (aka groz) et Mike Baker (aka [mbm]) en novembre 2003.\\
+\item Dès le début, Gerry et Mike perçoivent le potentiel d'un firmware basé sur Linux et les limitations dues au firmware Linksys, et décident de le remplacer par un système minimaliste, construit avec un buildroot uClibc de l'époque.
+\item La philosophie est simple : tout en ligne de commandes via SSH
+\end{itemize}
+}
+
+\subsection{Contexte}
+\frame
+{
+\frametitle{Contexte}
+\begin{itemize}
+\item A l'époque où la première version d'OpenWrt voit le jour, les firmwares Sveasoft sont déjà sortis depuis quelques mois et ajoutent de nombreuses fonctionnalités au firmware Linksys original tout en gardant l'interface web identique.\\
+\item Quelques mois plus tard, le firmware DD-WRT sortira, un fork d'OpenWrt, la principale raison étant le manque d'interface web.
+\end{itemize}
+}
+
+\subsection{Etat de l'art}
+\frame
+{
+\frametitle{Etat de l'art}
+Aujourd'hui, OpenWrt est constitué de 5 développeurs principaux aidés par de nombreux contributeurs :
+\begin{itemize}
+\item Mike Baker ([mbm])
+\item Imre Kaloz (Kaloz)
+\item Nicolas Thill (Nico)
+\item Felix Fietkau (nbd)
+\item Florian Fainelli (florian)
+\end{itemize}
+}
+
+
+\section{Les différentes versions}
+\subsection{Outils de développement}
+\frame
+{
+\frametitle{Outils de développement}
+\begin{itemize}
+\item dépôt subversion
+\item interface web Trac : https://dev.openwrt.org
+\end{itemize}
+}
+
+\frame
+{
+\subsection{Organisation du dépôt Subversion}
+\frametitle{Organisation du dépôt Subversion}
+Le dépôt subversion est organisé en différents répertoires:
+\begin{itemize}
+\item 2 branches : \textbf{whiterussian/} et \textbf{buildroot-ng/}
+\item 5 tags : whiterussian\_rc1 à 5
+\item 1 répertoire de paquetages : \textbf{packages/}
+\item kamikaze dans trunk (en cours de migration vers \textbf{buildroot-ng/}et \textbf{packages/}
+\end{itemize}
+}
+
+\subsection{Whiterussian}
+\frame
+{
+\frametitle{Whiterussian}
+
+Whiterussian est actuellement la version dite "stable" du firmware OpenWrt. Elle fonctionne bien sur les matériels à base de cartes Broadcom 947xx et 953xx, soit pour les plus répandus :
+\begin{itemize}
+\item Linksys WRT54G v1.0 à v4
+\item Asus WL-500g (Deluxe, Premium)
+\item Motorola WR850G, WE500G
+\item Buffalo WBR-B11, WBR-G54, WLA-G54
+\end{itemize}
+
+Elle sert de base aux firmwares de nombreuses communautés Wifistes, et à des sociétés comme FON (firmware fonbasic).
+}
+
+\subsection{Limitations de Whiterussian}
+\frame
+{
+\frametitle{Limitations de whiterussian}
+Bien que whiterussian fonctionne bien, le firmware est limité par :
+
+\begin{itemize}
+\item la nécessité d'utiliser un pilote binaire Broadcom pour la carte Wi-Fi, qui restreint à un noyau 2.4
+\item des paquetages difficiles à ajouter et à maintenir
+\item le support limité du matériel (uniquement Broadcom 47xx/53xx)
+\item une interface web qui repose beaucoup sur la présence d'une NVRAM
+\end{itemize}
+}
+
+\subsection{Kamikaze}
+\frame[allowframebreaks]
+{
+\frametitle{Kamikaze}
+Devant ces difficultés et l'apparition croissante de nouveaux matériels fonctionnant sous Linux, la branche \textbf{Kamikaze} est ouverte.
+
+De nouvelles plateformes sont ainsi supportées ~:
+\begin{itemize}
+\item Texas Instruments AR7 (noyau 2.4)
+\item Atheros AR531x (noyau 2.4)
+\item Aruba (noyau 2.6)
+\item x86 (noyaux 2.4 et 2.6)
+\item Broadcom SiByte (noyau 2.6)
+\item AMD Alchemy (noyau 2.6)
+\item Intel Xscale IX42x (noyau 2.6)
+\item Router Board RB532 (noyau 2.6)
+\end{itemize}
+}
+
+\subsection{Limitations de Kamikaze}
+\frame
+{
+\frametitle{Limitations de Kamikaze}
+Kamikaze souffre actuellement des inconvénients suivants :
+\begin{itemize}
+\item difficulté de stabilisation des noyaux, matériels non intégralement fonctionnels (Wi-Fi inopérant la plupart du temps)
+\item ajout et maintient de paquetages encore trop proche de Whiterussian
+\item maintient de 2 dépôts de paquetages compilés avec une toolchain différente
+\end{itemize}
+}
+
+\subsection{buildroot-ng}
+\frame
+{
+\frametitle{buildroot-ng}
+\begin{itemize}
+\item abstraction et simplication d'écriture des fichiers \textbf{Makefile} et compatibilité avec la syntaxe précédente
+\item les paquetages dépendant fortement du noyau vont dans \textbf{buildroot-ng}, les autres dans \textbf{packages/}
+\item dépôt multi-architectures indépendamment du du système de base
+\end{itemize}
+}
+
+\subsection{Principaux chantiers}
+\frame
+{
+\frametitle{Principaux chantiers}
+\begin{itemize}
+\item Finalisation de \textbf{buildroot-ng}
+\item Portage AR7-2.4 vers AR7-2.6
+\item Portage Broadcom 63xx 2.6
+\item Refonte de \textbf{webif}
+\item Ré-écriture de la documentation utilisateur
+\end{itemize}
+}
+
+\subsection{Intérêts d'OpenWrt}
+\frame
+{
+\frametitle{Intérêts d'OpenWrt}
+\begin{itemize}
+\item système complètement paramètrable du noyau au système de fichiers
+\item firmware unifié et identique quelle que soit la plateforme
+\item indépendance du système par rapport à des versions figées
+\item code intégralement GPL
+\end{itemize}
+}
+
+\section{Ajouter le support d'un nouveau matériel}
+\subsection{Considérations légales}
+\frame
+{
+\frametitle{Considérations légales}
+Plusieurs questions légales se posent lorsque vous avez connaissance qu'un matériel donné fonctionne sous Linux~:
+\begin{itemize}
+\item le constructeur livre-t-il le code source du firmware ?
+\item ce matériel utilise-t-il des pilotes fournis sous forme de binaires ?
+\item est-ce bien Linux ou uClinux ?
+\item le code fourni est-il bien sous licence GPL ou compatible ?
+\end{itemize}
+}
+
+\subsection{Prouver qu'un matériel fonctionne sous Linux}
+\frame
+{
+\frametitle{Prouver qu'un matériel fonctionne sous Linux}
+Plusieurs moyens s'offrent à vous pour montrer qu'un matériel fonctionne sous Linux :
+\begin{itemize}
+\item récupérer le firmware binaire et tenter de le séparer en : bootloader, noyau, système de fichiers (attention au Big/Little Endian !)
+\item brancher une console série/JTAG sur le routeur
+\item utiliser un bug de l'interface web pour récupérer un dmesg, cat /proc/xxxx
+\end{itemize}
+}
+
+\subsection{Si le constructeur ne livre pas le code source du firmware}
+\frame
+{
+\frametitle{Violation de la GPL}
+Conformément à la licence GPL, toute utilisation commerciale de logiciels libres oblige les constructeurs de matériel à :
+\begin{itemize}
+\item fournir les sources du noyau Linux
+\item fournir les sources des applications GPL présentent dans le sytème de fichiers
+\item fournir les sources de la chaîne de production GNU et des outils de création du système de fichiers
+\end{itemize}
+En cas de non-respect de la GPL, saisissez sans plus attendre : \texttt{http://gpl-violations.org}
+}
+
+\subsection{Base de travail}
+\frame
+{
+\frametitle{Base de travail}
+Votre base de travail est donc constituée :
+\begin{itemize}
+\item des sources du noyau Linux, modifiées pour avoir le support de la carte, et avec les derniers correctifs de l'architecture (arm, mips, ppc ...)
+\item des pilotes binaires et firmwares pour la carte Wi-Fi, Ethernet, modem ADSL ...
+\item des outils binaires de création du firmware : CRC, version, bourrage ...
+\end{itemize}
+Il y a peu de chances que vous réusissiez à obtenir un firmware fonctionnel avec les outils constructeurs.
+}
+\subsection{Evaluation du travail à réaliser}
+\frame
+{
+\frametitle{Evaluation du travail à réaliser}
+Compte tenu de ce dont nous disposons, pour obtenir un support fonctionnel du périphérique avec OpenWrt, et du fait que nous devons respecter la GPL, il nous reste à réaliser les tâches suivantes :
+\begin{itemize}
+\item analyser et générer les différences entre les sources du noyau Linux officiel et celles fournies
+\item créer un executable permettant de créer des images firmware valides (calcul CRC, versions, bourrage ...)
+\item garder la compatibilité entre les pilotes binaires et les versions actuelles du noyau Linux (attention à l'option VERSIONING)
+\item éventuellement, faire de l'ingénierie inverse sur les pilotes binaires
+\end{itemize}
+}
+
+\subsection{Ajout d'une nouvelle architecture dans buildroot-ng}
+\frame
+{
+\frametitle{Ajout d'une nouvelle architecture}
+Maintenant que nous avons les éléments nécessaires pour construire un système OpenWrt pour notre architecture cible, ajoutons le :
+\begin{itemize}
+\item ajout d'une entrée dans \textbf{target/Config.in}
+\item ajout d'un répertoire de la forme : \textbf{target/linux/architecture-2.x} (noyau 2.4 ou 2.6) contenant les patches spécifiques
+\item ajout d'un répertoire de la forme : \textbf{target/image/architecture} décrivant comment construire le firmware final
+\item appel des modèles de Makefile dans \textbf{include/target.mk}
+\end{itemize}
+}
+
+\subsection{Conventions}
+\frame
+{
+\frametitle{Conventions}
+\begin{itemize}
+\item Les architectures doivent être nommées de la même manière que le noyau Linux sous \textbf{arch/}
+\item Nous vous recommandons de faire booter un noyau "vanilla" patché plutôt que de commencer à créer le firmware final ;)
+\item Pensez à séparer les patchs : support de la carte, pilotes, correctifs divers ...
+\end{itemize}
+}
+
+\subsection{target/Config.in}
+\frame[containsverbatim]
+{
+\frametitle{target/Config.in}
+\begin{verbatim}
+config LINUX_2_6_ARCHITECTURE
+ bool "Architecture toto [2.6]"
+ select mips
+ select LINUX_2_6
+ select PCI_SUPPORT
+ select PCMCIA_SUPPORT
+ help
+ Une petite description
+\end{verbatim}
+}
+
+\subsection{target/linux/architecture-2.x/Makefile}
+\frame[containsverbatim,allowframebreaks]
+{
+\frametitle{target/linux/architecture-2.x/Makefile}
+\begin{verbatim}
+include $(TOPDIR)/rules.mk
+
+LINUX_VERSION:=2.6.16.7
+LINUX_RELEASE:=1
+LINUX_KERNEL_MD5SUM:=9682b2bd6e02f3087982d7c3f5ba824e
+
+include ./config
+include $(INCLUDE_DIR)/kernel.mk
+include $(INCLUDE_DIR)/kernel-build.mk
+
+$(LINUX_DIR)/.patched: $(LINUX_DIR)/.unpacked
+ [ -d ../generic-$(KERNEL)/patches ] &&
+$(PATCH) $(LINUX_DIR) ../generic-$(KERNEL)/patches $(MAKE_TRACE)
+ [ -d ./patches ] &&
+$(PATCH) $(LINUX_DIR) ./patches $(MAKE_TRACE)
+ @$(CP) config $(LINUX_DIR)/.config
+ touch $@
+\end{verbatim}
+}
+
+\subsection{target/image/architecture/Makefile}
+\frame[containsverbatim,allowframebreaks]
+{
+\frametitle{target/image/architecture/Makefile}
+\begin{verbatim}
+include $(TOPDIR)/rules.mk
+include $(INCLUDE_DIR)/image.mk
+
+define Build/Compile
+ rm -f $(KDIR)/loader.gz
+ $(MAKE) -C lzma-loader \
+ BUILD_DIR="$(KDIR)" \
+ TARGET="$(KDIR)" \
+ install
+endef
+
+define Build/Clean
+ $(MAKE) -C lzma-loader clean
+endef
+define Image/Prepare
+ cat $(KDIR)/vmlinux |
+$(STAGING_DIR)/bin/lzma e -si -so -eos -lc1 -lp2 -pb2 > $(KDIR)/vmlinux.lzma
+endef
+
+define Image/Build/périphérique
+ dd if=$(KDIR)/loader.elf
+of=$(BIN_DIR)/openwrt-périphérique-$(KERNEL)-$(2).bin
+bs=131072 conv=sync
+ cat $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1).trx
+>> $(BIN_DIR)/openwrt-périphérique-$(KERNEL)-$(2).bin
+endef
+
+define trxalign/jffs2-128k
+-a 0x20000
+endef
+define trxalign/jffs2-64k
+-a 0x10000
+endef
+define trxalign/squashfs
+-a 1024
+endef
+
+$(eval $(call BuildImage))
+\end{verbatim}
+}
+
+\subsection{include/target.mk}
+\frame[containsverbatim]
+{
+\frametitle{include/target.mk}
+\begin{verbatim}
+...
+$(eval $(call kernel_template,2.6,architecture,
+ 2_6_ARCHITECTURE))
+...
+\end{verbatim}
+}
+
+\subsection{Déboguer et stabiliser le portage}
+
+\frame
+{
+\frametitle{Déboguer et stabiliser}
+Outils de déboguage :
+\begin{itemize}
+\item GDB
+\item EJTAG (si disponible)
+\item ksymoops
+\item l'utilisation de printfk
+\item un noyau compilé avec les options de déboguage adéquates
+\item documentation du bootloader (RedBoot, CFE, YAMON, RomE ...)
+\item faire appel aux utilisateurs et développeurs
+\end{itemize}
+}
+
+\subsection{Problèmes ultérieurs}
+\frame
+{
+\frametitle{Problèmes ultérieurs}
+Une fois que vous avez réussi à avoir un noyau bootant sur votre matériel, il n'est pas encore utilisable. Il y a fort à parier que :
+\begin{itemize}
+\item les pilotes ne fonctionnent pas ou pas très bien
+\item la cartographie de la flash ne soit pas forcément reconnue
+\item le système soit lent, et nécessite des modifications dans le noyau
+\end{itemize}
+}
+
+\section{Personnaliser le système}
+
+\frame
+{
+\frametitle{Personnaliser le système}
+Vous pouvez intégralement personnaliser votre système sur votre routeur point d'accès Wi-Fi, notamment :
+\begin{itemize}
+\item ajouter un portail captif, un serveur RADIUS
+\item gérer au mieux le pare-feu avec iptables
+\item ajouter des protocoles et piles réseau, des services ...
+\item ajouter des pilotes de périphériques supplémentaires : webcam, cartes Wi-Fi ...
+\item ajouter des des fonctionnalités à l'interface \textbf{webif}
+\end{itemize}
+}
+
+\subsection{Ajouter des paquetages}
+\frame
+{
+\frametitle{Ajouter des paquetages}
+Nous vous invitons à participer à l'effort de migration des paquetages présents dans \textbf{kamikaze} vers la syntaxe \textbf{buildroot-ng}.
+
+Contrairement aux systèmes précédents où il fallait créer au moins 3 fichiers :
+\begin{itemize}
+\item Makefile
+\item Config.in
+\item ipkg/paquetage.control
+\end{itemize}
+
+\textbf{buildroot-ng} permet de s'affranchir de ces fichiers en les rassemblant en un seul fichier \textbf{Makefile}.
+}
+
+\subsection{Hiérarchie}
+\frame
+{
+\frametitle{Hiérarchie}
+Les paquetages sont organisés sous forme la forme suivante :
+
+\begin{tabbing}
+\hspace{10 pt}\=\hspace{10 pt}\=\hspace{10 pt}\=\kill
+packages/ \> \> \> \\
+ \> section/ \> \> \\
+ \> \> paquetage/ \> \\
+ \> \> \> Makefile \\
+ \> \> \> patches/
+\end{tabbing}
+}
+
+\subsection{packages/section/Makefile}
+\frame[containsverbatim,allowframebreaks]
+{
+\frametitle{packages/section/Makefile}
+\begin{verbatim}
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=mon-paquetage
+PKG_VERSION:=alpha-beta-4
+PKG_RELEASE:=1
+PKG_MD5SUM:=5988e7aeb0ae4dac8d83561265984cc9
+
+PKG_SOURCE_URL:=ftp://ftp.openwrt.org/mon-paquetage
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_CAT:=zcat
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
+PKG_INSTALL_DIR:=$(PKG_BUILD_DIR)/ipkg-install
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/mon-paquetage
+SECTION:=libs
+CATEGORY:=Libraries
+TITLE:=Un programme de demonstation
+DESCRIPTION:=Un programme de démonstration également
+URL:=ftp://ftp.openwrt.org/mon-paquetage
+endef
+
+define Build/Configure
+$(call Build/Configure/Default,--option-supplémentaire=paquetage)
+endef
+
+define Build/Compile
+ rm -rf $(PKG_INSTALL_DIR)
+ mkdir -p $(PKG_INSTALL_DIR)
+ $(MAKE) -C $(PKG_BUILD_DIR) \
+ DESTDIR="$(PKG_INSTALL_DIR)" \
+ all install
+endef
+
+define Package/mon-paquetage/install
+ install -m0755 -d $(1)/usr/lib
+ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpaquetage.so.* $(1)/usr/lib/
+endef
+
+define Build/InstallDev
+ mkdir -p $(STAGING_DIR)/usr/include
+ $(CP) $(PKG_INSTALL_DIR)/usr/include/en-tête-paquetage.h $(STAGING_DIR)/usr/include/
+ mkdir -p $(STAGING_DIR)/usr/lib
+ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpaquetage.{a,so*} $(STAGING_DIR)/usr/lib/
+ touch $(STAGING_DIR)/usr/lib/libpaquetage.so
+endef
+
+define Build/UninstallDev
+ rm -rf \
+ $(STAGING_DIR)/usr/include/en-tête-paquetage.h \
+ $(STAGING_DIR)/usr/lib/libpaquetage.{a,so*}
+endef
+
+$(eval $(call BuildPackage,mon-paquetage))
+\end{verbatim}
+}
+
+\section{Obtenir de l'aide}
+
+\frame
+{
+\frametitle{Obtenit de l'aide}
+N'hésitez pas à nous contacter à l'aide des moyens suivants~:
+\begin{itemize}
+\item IRC : irc.freenode.net \#openwrt et \#openwrt-devel
+\item Mailing-list : openwrt-devel@openwrt.org
+\item Forum : http://forum.openwrt.org
+\end{itemize}
+}
+
+\section{Devenir développeur}
+
+\frame
+{
+\frametitle{Devenir développeur}
+\begin{itemize}
+\item N'hésitez pas à nous soumettre des patchs ajoutant des paquetages
+\item Testez et rapportez les bugs que vous rencontrez, tout correctif est le bienvenu
+\item Faîtes fonctionner OpenWrt sur une nouvelle architecture, stabilisez un portage existant ..
+\end{itemize}
+}
+
+\frame
+{
+\frametitle{Merci à tous}
+Merci de votre attention, n'hésitez surtout à pas poser vos questions
+}
+
+\end{document}