| 1 |
\documentclass[12pt,a4paper,openany,smallheadings,headinclude,headsepline,final]{scrreprt} |
| 2 |
%\usepackage{ucs} % Unicode support |
| 3 |
\usepackage[utf8]{inputenc} % UTF-8 characters as input are allowed |
| 4 |
%\usepackage{amsmath} |
| 5 |
%\usepackage{amsfonts} |
| 6 |
%\usepackage{amssymb} |
| 7 |
%\usepackage{caption2} |
| 8 |
\usepackage[english]{babel} % Sets the layout to English style |
| 9 |
\usepackage{varioref} % Intelligent page references |
| 10 |
\usepackage{txfonts} |
| 11 |
\usepackage[pdftex]{color} % Colour control for LaTeX documents |
| 12 |
\usepackage[pdftex]{graphicx} % Enhanced support for graphics |
| 13 |
%\usepackage{listings} |
| 14 |
\usepackage{makeidx} % Standard LaTeX package for creating indexes |
| 15 |
\usepackage{longtable} % Allow tables to flow over page boundaries |
| 16 |
\usepackage[T1]{fontenc} % T1-fonts |
| 17 |
\usepackage{fancyvrb} % Sophisticated verbatim text |
| 18 |
\usepackage[a4paper,rmargin=2cm,lmargin=2cm,tmargin=2.5cm,bmargin=3.5cm]{geometry} % Flexible and complete interface to document dimensions |
| 19 |
\usepackage{fixltx2e, mparhack} % Patches for LaTeX; A workaround for a LaTeX bug in marginpars |
| 20 |
\usepackage[nofancy]{svninfo} % Typeset Subversion Keywords |
| 21 |
\usepackage{float} % Improved interface for floating objects |
| 22 |
\usepackage{hyperref} % Extensive support for hypertext in LaTeX |
| 23 |
|
| 24 |
|
| 25 |
\definecolor{skyblue}{rgb}{0,0.3323,0.5720} |
| 26 |
\restylefloat{figure} |
| 27 |
\hypersetup{ |
| 28 |
colorlinks=true,anchorcolor=red, |
| 29 |
breaklinks=true,linkcolor=blue,urlcolor=red, |
| 30 |
citecolor=skyblue, |
| 31 |
pdfauthor={The FreeWRT Team}, |
| 32 |
pdftitle={FreeWRT User Handbook}, |
| 33 |
pdfcreator={tetex and VIM}, |
| 34 |
pdfsubject={Open Source}, |
| 35 |
pdfview=FitV, |
| 36 |
pdfstartview=FitV, |
| 37 |
pdfstartpage={1}, |
| 38 |
pdfpagelayout=SinglePage, |
| 39 |
pdfpagemode=None, |
| 40 |
pdfkeywords={FreeWRT} |
| 41 |
} |
| 42 |
\fvset{fontsize=\small, frame=single} % fancyvrb: set small font size and enable frames |
| 43 |
%\usepackage{cancel} |
| 44 |
%\usepackage[final, activate, verbose=true]{microtype} |
| 45 |
%\usepackage{ngerman} |
| 46 |
%\usepackage{bookman} |
| 47 |
%\usepackage[a4paper,twoside,rmargin=2cm,lmargin=2cm,tmargin=2.5cm]{geometry} |
| 48 |
%\usepackage[a4paper,rmargin=2cm,lmargin=2cm,tmargin=2.5cm,bmargin=3.5cm]{geometry} |
| 49 |
%\usepackage{ncntrsbk} |
| 50 |
%\usepackage{float} |
| 51 |
%\restylefloat{figure} |
| 52 |
%\bibliographystyle{alphadin} |
| 53 |
%\bibliographystyle{alpha} |
| 54 |
|
| 55 |
% Generate index in preamble |
| 56 |
\makeindex |
| 57 |
|
| 58 |
\begin{document} |
| 59 |
\svnInfo $Id$ |
| 60 |
\setlength{\marginparwidth}{10mm} |
| 61 |
|
| 62 |
\include{cover} |
| 63 |
|
| 64 |
\renewcommand{\thepage}{\roman{page}} |
| 65 |
\tableofcontents |
| 66 |
%Set Arabic Numbering 1,2,3,... |
| 67 |
% Clear needed to renumber from the right position |
| 68 |
\cleardoublepage |
| 69 |
\renewcommand{\thepage}{\arabic{page}} |
| 70 |
%Reset Counter |
| 71 |
%\setcounter{page}{1} |
| 72 |
|
| 73 |
% Set marks where it should Change |
| 74 |
\renewcommand{\chaptermark}[1]{% |
| 75 |
\markboth{\large \thechapter.\ \normalsize \scshape #1}{}} |
| 76 |
\renewcommand{\sectionmark}[1]{\markright{\thesection.\ \scshape #1}} |
| 77 |
|
| 78 |
|
| 79 |
% Create some new commands for designing the text |
| 80 |
% applications |
| 81 |
\newcommand{\app}[1]{% |
| 82 |
\textsf{\textit{#1}}} |
| 83 |
% terminology, vendor or product names |
| 84 |
\newcommand{\term}[1]{% |
| 85 |
\textsc{#1}} |
| 86 |
% filenames and directories |
| 87 |
\newcommand{\file}[1]{% |
| 88 |
\textsf{#1}} |
| 89 |
% user input |
| 90 |
\newcommand{\command}[1]{% |
| 91 |
\texttt{\textbf{#1}}} |
| 92 |
% example code, output of applications |
| 93 |
\newcommand{\code}[1]{% |
| 94 |
\texttt{#1}} |
| 95 |
% emphasized text (nicer than \emph{}) |
| 96 |
\newcommand{\strong}[1]{% |
| 97 |
\textbf{#1}} |
| 98 |
|
| 99 |
|
| 100 |
\chapter{Introduction} |
| 101 |
|
| 102 |
Welcome to FreeWRT! This handbook covers the building, installation and usage |
| 103 |
aspects of the FreeWRT 1.0 Linux distribution. FreeWRT is a portable, secure |
| 104 |
and functional Linux distribution for embedded systems. As FreeWRT is a source |
| 105 |
code distribution, it does not provide any pre-compiled firmware for embedded |
| 106 |
systems. The latest version of this document is always available at the FreeWRT |
| 107 |
website. If you have any comments, criticism or found some wrong description, |
| 108 |
please send us an e-mail to |
| 109 |
\href{mailto:freewrt-handbook@freewrt.org}{freewrt-handbook@freewrt.org}, we |
| 110 |
are always happy about getting feedback to this document, and will try to |
| 111 |
update or correct the issues mentioned by you. |
| 112 |
|
| 113 |
The FreeWRT User handbook is split into several distinct chapters. |
| 114 |
\nameref{ch:ADK} covers the building of FreeWRT firmware images. In |
| 115 |
\autoref{ch:installing}, \nameref{ch:installing}, all aspects regarding the |
| 116 |
installation and deinstallation of FreeWRT firmware images are covered. The |
| 117 |
next chapter, \nameref{ch:administration}, covers administrational tasks, such |
| 118 |
as network configuration, the FreeWRT configuration filesystem, package |
| 119 |
management and update mechanism. The last chapter, |
| 120 |
\nameref{ch:troubleshooting}, helps troubleshooting problems and recovering a |
| 121 |
bad firmware installation. The appendix contains board specific information. |
| 122 |
For FreeWRT 1.0 these are only Broadcom based embedded systems. |
| 123 |
|
| 124 |
The intended audience for this handbook are advanced users with basic knowledge |
| 125 |
about Linux, networking and software development. The reader should be aware of |
| 126 |
basic command line tools, the vi editor and a shell. FreeWRT does not contain |
| 127 |
any high level administration tools (e.g. web based administration) and is |
| 128 |
fully configured via command line. |
| 129 |
|
| 130 |
\section{Typographic Conventions} |
| 131 |
|
| 132 |
Examples starting with \code{\#} indicate a command that must be invoked as |
| 133 |
super user. You can use \command{su} to gain super user privileges. |
| 134 |
|
| 135 |
\begin{Verbatim}[label=example for a command line with super user privileges] |
| 136 |
# fwcf commit |
| 137 |
\end{Verbatim} |
| 138 |
|
| 139 |
Examples starting with \code{\$} indicate a command that can be invoked as a |
| 140 |
normal user. The default user account on a freshly installed FreeWRT system is |
| 141 |
"\code{admin}", the password "\code{FreeWRT}". |
| 142 |
|
| 143 |
\begin{Verbatim}[label=example for a command line as non-privileged user] |
| 144 |
$ cat /etc/banner |
| 145 |
\end{Verbatim} |
| 146 |
|
| 147 |
%\chapter{Web Interface Builder (WIB)}\label{ch:WIB} |
| 148 |
% |
| 149 |
%FIXME It is named later in the text, but not explained what it is. Probably |
| 150 |
%this chapter can be joined with the chapter about ADK |
| 151 |
|
| 152 |
\chapter{Appliance Development Kit (ADK)}\label{ch:ADK} |
| 153 |
|
| 154 |
The ADK is the core of FreeWRT and contains all scripts and sources to create |
| 155 |
firmware images for every supported embedded system. FreeWRT 1.0 supports the |
| 156 |
following embedded systems: |
| 157 |
|
| 158 |
\begin{itemize} |
| 159 |
\item Asus WL500g |
| 160 |
\item Asus WL500g deluxe |
| 161 |
\item Asus WL500g premium |
| 162 |
\item Linksys WRT54G v2.0 |
| 163 |
\item Linksys WRT54G v2.2 |
| 164 |
\item Linksys WRT54G v3.0 |
| 165 |
\item Linksys WRT54G v3.1 |
| 166 |
\item Linksys WRT54G v4.0 |
| 167 |
\item Linksys WRT54GS v1.0 |
| 168 |
\item Linksys WRT54GS v1.1 |
| 169 |
\item Linksys WRT54GS v4 |
| 170 |
\item Linksys WRT54G3G |
| 171 |
\item Linksys WRT54GL |
| 172 |
\item Netgear WGT634u |
| 173 |
\end{itemize} |
| 174 |
|
| 175 |
In this release we only support the Linux 2.4 kernel. The ADK contains over 600 |
| 176 |
software packages. |
| 177 |
|
| 178 |
\section{Prerequisites} |
| 179 |
|
| 180 |
Here is a list of all supported and tested host systems. The host system is |
| 181 |
needed to create a firmware for your embedded system. |
| 182 |
|
| 183 |
The list of supported GNU/Linux build systems is not an exclusive one, these |
| 184 |
are just the ones tested and verified. The other millions of linux |
| 185 |
distributions are very likely to work, too. |
| 186 |
|
| 187 |
\begin{itemize} |
| 188 |
\item Debian GNU/Linux |
| 189 |
\item Gentoo Linux |
| 190 |
\item OpenSuSE |
| 191 |
\item Ubuntu GNU/Linux |
| 192 |
\item Fedora Core |
| 193 |
\item OpenBSD (partial support) |
| 194 |
\footnote{some addon packages does not compile} |
| 195 |
\item MirOS BSD (partial support) |
| 196 |
\footnote{some addon packages does not compile} |
| 197 |
\end{itemize} |
| 198 |
|
| 199 |
Please install the following software, which is needed to build a basic |
| 200 |
firmware image. If you choose more packages some more prerequisites might be |
| 201 |
needed. The ADK host checks will warn you about any software you need to |
| 202 |
install to compile a specific package. Here is a list of the required |
| 203 |
software: |
| 204 |
|
| 205 |
\begin{itemize} |
| 206 |
\item gcc3 or higher |
| 207 |
\item g++ |
| 208 |
\item binutils |
| 209 |
\item patch |
| 210 |
\item gzip |
| 211 |
\item bzip2 |
| 212 |
\item unzip |
| 213 |
\item flex |
| 214 |
\item bison |
| 215 |
\item GNU make |
| 216 |
\item zlib (+headers) |
| 217 |
\item ncurses (+headers) |
| 218 |
\item (g)libc headers |
| 219 |
\item perl |
| 220 |
\end{itemize} |
| 221 |
|
| 222 |
The ADK scripts will check for the required versions of these tools in advance. |
| 223 |
|
| 224 |
To build FreeWRT with the ADK it is recommended to have an unprivileged user. |
| 225 |
Please \underline{never} build FreeWRT as super user. Because all necessary |
| 226 |
source tarballs are downloaded from the internet automatically, your host |
| 227 |
system needs a working internet connection. |
| 228 |
|
| 229 |
\section{Getting the source} |
| 230 |
|
| 231 |
Now go to a directory where you want to build the firmware. Depending on the |
| 232 |
features you select you will need about 2.5--5 GB free disk space. This |
| 233 |
includes the ADK itself, any source archives which will be downloaded and their |
| 234 |
extracted copies (for compiling). |
| 235 |
|
| 236 |
To get the latest stable FreeWRT ADK try one of these commands: |
| 237 |
\begin{Verbatim}[label=Check out an 1.0.x revision of FreeWRT ADK via HTTP protocol] |
| 238 |
$ svn co http://www.freewrt.org/svn/tags/freewrt_1_0_x freewrt |
| 239 |
\end{Verbatim} |
| 240 |
\begin{Verbatim}[label=Check out the 1.0-stable branch of FreeWRT ADK via HTTP protocol] |
| 241 |
$ svn co http://www.freewrt.org/svn/branches/freewrt_1_0 freewrt |
| 242 |
\end{Verbatim} |
| 243 |
|
| 244 |
The value $x$ is a place holder for the latest minor release number. Take a |
| 245 |
look at our project page to find out which minor release number is the latest |
| 246 |
one. |
| 247 |
|
| 248 |
After successfully downloading, enter the directory: |
| 249 |
|
| 250 |
\begin{Verbatim} |
| 251 |
$ cd freewrt |
| 252 |
\end{Verbatim} |
| 253 |
|
| 254 |
This directory will be referred to as the ADK root later on. |
| 255 |
|
| 256 |
\section{Some Theory First} |
| 257 |
|
| 258 |
Building a FreeWRT firmware image is just like building a new Linux kernel, but |
| 259 |
a little more complex. There is a \app{ncurses}-based configuration menu at the |
| 260 |
beginning, the changes made are saved into a file named \file{.config} in the |
| 261 |
ADK root. The build is done by the various Makefiles, compiling and linking the |
| 262 |
sources together accordingly to the symbols defined in \file{.config}. |
| 263 |
|
| 264 |
Unlike kernel compilation, FreeWRT needs to be cross-compiled. This leads to |
| 265 |
special premises, as most of the tools need to be specially build. But no |
| 266 |
panic, FreeWRT will do this all for you. In fact, this is done at the second |
| 267 |
run of \command{make} (the first one opens the configuration), and therefore |
| 268 |
can be seen as part of the first firmware build. For clarity though, we will |
| 269 |
discuss these two things separately. |
| 270 |
|
| 271 |
\section{Preparing the Build Process} |
| 272 |
|
| 273 |
After downloading the FreeWRT ADK, it's time to prepare the ADK for the |
| 274 |
building of firmware images (for explanations see the chapter above). |
| 275 |
|
| 276 |
\subsection{Creating A Configuration} |
| 277 |
|
| 278 |
The first step is to run \command{make}. After checking some prerequisites (see |
| 279 |
\nameref{ch:troubleshooting} below for aid in problems), a console based |
| 280 |
configuration menu should start. Theoretically no choices have to be made, but |
| 281 |
it's proven useful to at least: |
| 282 |
\begin{itemize} |
| 283 |
\item select a target (menu: \code{Embedded System}) |
| 284 |
\item select the root filesystem type (menu: \code{Target Firmware type}) |
| 285 |
\end{itemize} |
| 286 |
|
| 287 |
Then quit saving changes. If you forgot that, just run \command{make} again, |
| 288 |
redo your changes, then save. |
| 289 |
|
| 290 |
\subsection{Building ADK} |
| 291 |
|
| 292 |
Now that you have a first minimal configuration, it is time to build the |
| 293 |
toolchain for cross-compiling. To do this, just enter \command{make} again. The |
| 294 |
build starts downloading and compiling each needed part of the toolchain, and |
| 295 |
later continues with building the first firmware image. Later one can be taken |
| 296 |
as proof of a working ADK. |
| 297 |
|
| 298 |
Already experienced in compiling \app{gcc}? Then you know\dots If not, better |
| 299 |
be told that it takes \underline{really long} to finish. In the meantime I |
| 300 |
suggest reading the next chapter dealing with internals about cross-compiling. |
| 301 |
|
| 302 |
\section{Details Of Cross-Compiling} |
| 303 |
|
| 304 |
A cross-compile toolchain exists of a set of tools: a compiler, linker, |
| 305 |
assembler, debugger and a C~library. A cross-compile toolchain runs on your |
| 306 |
host system and creates native binaries for your target system. A cross-compile |
| 307 |
toolchain is basically created in six steps: |
| 308 |
|
| 309 |
\begin{enumerate} |
| 310 |
\item Get and prepare the Kernel and C~library headers of your target system |
| 311 |
\item Compile the binutils package for your target |
| 312 |
\item Compile a static C~compiler for your target |
| 313 |
\item Compile and install a C~library for your target |
| 314 |
\item Compile and install a full C/C++~compiler |
| 315 |
\item Compile and install the GNU debugger |
| 316 |
\end{enumerate} |
| 317 |
|
| 318 |
The cross-compile toolchain is created in |
| 319 |
\file{staging\_dir\_\$(cpu\_arch)}\footnote{e.g. mipsel, which stands for MIPS |
| 320 |
Little Endian}. All the tools running on the host, but used to create, analyze |
| 321 |
or debug for the target are kept in this directory. All addon headers and |
| 322 |
libraries are installed to this directory. |
| 323 |
|
| 324 |
If you want to compile a simple application without using the ADK, just use the |
| 325 |
compiler directly (e.g. compiling a MIPS Little Endian application): |
| 326 |
\begin{Verbatim}[label=compile a simple application with the cross-compiler] |
| 327 |
./staging_dir_mipsel/bin/mipsel-linux-uclibc-gcc -o myapp myapp.c |
| 328 |
\end{Verbatim} |
| 329 |
|
| 330 |
Check with the tool \app{file} if you got a MIPS binary: |
| 331 |
\begin{Verbatim}[label=check the binary with \app{file}] |
| 332 |
$ file myapp |
| 333 |
myapp: ELF 32-bit LSB MIPS-I executable, MIPS, version 1 (SYSV), dynamically |
| 334 |
linked (uses shared libs), not stripped |
| 335 |
\end{Verbatim} |
| 336 |
|
| 337 |
\section{Building A FreeWRT Firmware Image} |
| 338 |
|
| 339 |
Your local copy of the FreeWRT ADK should now be prepared for building firmware |
| 340 |
images. The next step is to do an extensive configuration for the image you |
| 341 |
want to create. To start the configuration menu, type \command{make |
| 342 |
menuconfig}. |
| 343 |
|
| 344 |
When selecting packages, \code{<*>} means it will be inserted into the firmware |
| 345 |
images and \code{<M>} means it will be build as an addon package which can be |
| 346 |
installed later at runtime. |
| 347 |
|
| 348 |
The target device and filesystem should already been chosen by you to the right |
| 349 |
value, if not you will have to issue a \command{make clean} before actually |
| 350 |
building the firmware image. Otherwise things get messed up. A smooth rebuild |
| 351 |
is a missing feature in the current ADK. For the packages, if unsure, you can |
| 352 |
just select one of the package collections. After that, you can still manually |
| 353 |
check the choices made by the collection and correct them if appropriate. Do |
| 354 |
not forget to save your configuration when leaving! |
| 355 |
|
| 356 |
After leaving the menubased configuration, type \command{make} again to build |
| 357 |
the new FreeWRT firmware image. Depending on your package selections and |
| 358 |
underlying hardware, this will take different amounts of time. For your spare |
| 359 |
time there is the following chapter giving some explanation about what is done |
| 360 |
at this point. |
| 361 |
|
| 362 |
\section{Firmware Build Process In Detail} |
| 363 |
|
| 364 |
Just like when building the ADK's toolchain, the sources for the selected |
| 365 |
packages are downloaded from the internet first, then built using the |
| 366 |
cross-compiler and libraries of the ADK. |
| 367 |
|
| 368 |
The detailed order of firmware image building is: |
| 369 |
|
| 370 |
\begin{itemize} |
| 371 |
\item compile the Linux kernel and all supported kernel modules |
| 372 |
\item compile all selected packages |
| 373 |
\item clean the target root directory |
| 374 |
\item install all packages to the target root directory |
| 375 |
\item create the root filesystem image |
| 376 |
\item create the firmware image (bootloader, kernel and root |
| 377 |
filesystem) |
| 378 |
\end{itemize} |
| 379 |
|
| 380 |
The result of the build process is created in the directory \file{bin/}. You |
| 381 |
will find a firmware image in the top level directory. Check the size of the |
| 382 |
binary image file to see if it is small enough to fit into flash memory of your |
| 383 |
embedded system. Furthermore there is a directory \file{package/}, which |
| 384 |
contains all base and add--on packages. |
| 385 |
|
| 386 |
\section{Troubleshooting} |
| 387 |
|
| 388 |
This section deals with various tips for problems with the ADK installation. |
| 389 |
|
| 390 |
\subsection{Errors During Prerequisites Check} |
| 391 |
|
| 392 |
To re-issue the checks, use \command{make prereq}. |
| 393 |
|
| 394 |
\begin{itemize} |
| 395 |
\item GNU make 3.80 too old \\ |
| 396 |
On a Fedora Core 4 hostsystem the first you'll get is |
| 397 |
\begin{Verbatim}[label=error message with too old GNU make] |
| 398 |
$ make |
| 399 |
GNU make 3.80 too old. |
| 400 |
Please install GNU make 3.81 or higher to continue. |
| 401 |
You can override this check, see http://www.freewrt.org/faq for details. |
| 402 |
It is suggested to upgrade your copy of bison to |
| 403 |
GNU Bison 2.3 because of its bug fixes. |
| 404 |
make: *** [.prereq_done] Error 1 |
| 405 |
\end{Verbatim} |
| 406 |
it is quite a nice error that tells you to use more up to date software, but |
| 407 |
we can anyhow give this hostsystem a try and tell make to ignore those |
| 408 |
errors/warnings running \command{make prereq-noerror}. |
| 409 |
\end{itemize} |
| 410 |
|
| 411 |
\subsection{Compilation errors} |
| 412 |
|
| 413 |
If you encounter any compilation errors, then first try to reproduce the error. |
| 414 |
First update your ADK tree via \command{svn update}, to be sure that the error |
| 415 |
is not already fixed in the subversion repository. After that do a |
| 416 |
\command{make clean \&\& make}, to reproduce your problem. |
| 417 |
|
| 418 |
If you can reproduce the problem, please file a bug report. Please always |
| 419 |
report following information: |
| 420 |
\begin{itemize} |
| 421 |
\item Operating system type and version |
| 422 |
\item GCC and Binutils versions of your host system |
| 423 |
\item complete error message, not only the last 4 lines |
| 424 |
\end{itemize} |
| 425 |
|
| 426 |
\chapter{Installing FreeWRT Firmware Images}\label{ch:installing} |
| 427 |
|
| 428 |
The FreeWRT ADK produces a single image holding both kernel and root |
| 429 |
filesystem. This image can be written into your hardware's builtin flash memory |
| 430 |
on serveral ways (ordered by needed skills, increasing downwards): |
| 431 |
\begin{itemize} |
| 432 |
\item via the original firmware's web interface |
| 433 |
(\autoref{sec:webinterface}) |
| 434 |
\item via \texttt{mtd} when reflashing or migrating from another third |
| 435 |
party distribution (\autoref{sec:mtd}) |
| 436 |
\item via network using a TFTP client (\autoref{sec:tftp}) |
| 437 |
\end{itemize} |
| 438 |
|
| 439 |
\section{Flashing The Firmware} |
| 440 |
|
| 441 |
\subsection{Web Interface Method}\label{sec:webinterface} |
| 442 |
|
| 443 |
The following text describes how to use the original firmware's web interface |
| 444 |
to flash FreeWRT. The object of demonstration is an \term{Asus WL500gP}, but |
| 445 |
this guide should fit more or less fine for other systems, too. |
| 446 |
|
| 447 |
If you flash a router from \term{Linksys}, we strongly suggest to use the |
| 448 |
popular \term{ping exploit} to allow recovery, if your image is broken or the |
| 449 |
flash process was interrupted by a power shortage. |
| 450 |
|
| 451 |
There are some things that you should have done previously: |
| 452 |
\begin{itemize} |
| 453 |
\item read the special documentation page about your hardware in our wiki, some |
| 454 |
systems need special precaution before flashing |
| 455 |
\item a firmware image has to be built (matching the used hardware, of course) |
| 456 |
\item the router has to be powered on |
| 457 |
\item your computer needs to be connected to one of the LAN ports |
| 458 |
(using IP address \file{192.168.1.2}) |
| 459 |
\end{itemize} |
| 460 |
|
| 461 |
\parbox{17em}{ |
| 462 |
After preparation is complete, open your favourite browser and type |
| 463 |
\command{192.168.1.1} into the address bar. You should reach the web |
| 464 |
interface's startup page: |
| 465 |
}\hfill\parbox{20em}{ |
| 466 |
\includegraphics[width=20em]{pics/asus-startup.png} |
| 467 |
} \\ [1em] |
| 468 |
\parbox{17em}{ |
| 469 |
Then click on \code{System Setup}: |
| 470 |
}\hfill\parbox{20em}{ |
| 471 |
\includegraphics[width=20em]{pics/asus-system_setup.png} |
| 472 |
} \\ [1em] |
| 473 |
\parbox{17em}{ |
| 474 |
In the new menu click on \code{Firmware Upgrade}, and enter the name of your |
| 475 |
firmware image into the appropriate field: |
| 476 |
}\hfill\parbox{20em}{ |
| 477 |
\includegraphics[width=20em]{pics/asus-fw_upgrade.png} |
| 478 |
} \\ [1em] |
| 479 |
Finally click on \code{Upload}. As the whole process of writing the image to |
| 480 |
flash and rebooting (don't forget that it creates \app{ssh} hostkeys on first |
| 481 |
boot) takes quite long (yes, a couple of minutes). Better go and get a coffee |
| 482 |
or tea. |
| 483 |
|
| 484 |
When everything went well, you can login using \app{ssh}. The default username |
| 485 |
is "\code{admin}". The default password for images created via WIB or ADK is |
| 486 |
"\code{FreeWRT}". It is possible to change this password in the ADK, before |
| 487 |
image creation. |
| 488 |
|
| 489 |
\subsection{\texttt{mtd} -- The Flash Utility}\label{sec:mtd} |
| 490 |
|
| 491 |
For this method to work, you need to copy the file containing the firmware |
| 492 |
image to the router, preferably into \file{/tmp/}, the memory filesystem should |
| 493 |
be big enough to hold the full image. If not, use \app{wget} to get the image |
| 494 |
via http or ftp and pipe the result into \app{mtd}. |
| 495 |
|
| 496 |
Then the image is written to flash using \app{mtd}, optionally giving |
| 497 |
additional options (see below). |
| 498 |
|
| 499 |
The \app{mtd} utility was written with simplicity and code size in mind. It's |
| 500 |
features were derived from the |
| 501 |
\href{http://sources.redhat.com/jffs2/}{\app{mtd-utils}}, combining the needed |
| 502 |
parts into a single small tool providing all the functionality necessary for |
| 503 |
FreeWRT, and leaving everything out that's not. |
| 504 |
|
| 505 |
\app{mtd} provides the following features: |
| 506 |
\begin{description} |
| 507 |
\item[unlock] some chips need unlocking before they can be written to |
| 508 |
\item[erase] this is a filesystem independent method to delete all |
| 509 |
contents on the flash. Basically this is like \app{format} in |
| 510 |
MS--DOS. |
| 511 |
\item[write] this is generally the same functionality as using \app{dd} |
| 512 |
or \app{rawrite}, but \app{mtd} takes care of the quirks that |
| 513 |
have to be paid attention to for correctly handling the type of |
| 514 |
flash in use |
| 515 |
\end{description} |
| 516 |
|
| 517 |
Further it can request your system to reboot. Some of the features mentioned |
| 518 |
here can also be combined, so it is e.g. possible to immediately reboot the |
| 519 |
system after the flash has been written. |
| 520 |
|
| 521 |
Mostly, similar to the sample usage shown in the help output should be all that |
| 522 |
has to be done to write the firmware to flash: |
| 523 |
\begin{Verbatim}[label=write a previously downloaded new firmware-file into flash] |
| 524 |
# mtd -e linux -r write freewrt.bin linux & |
| 525 |
\end{Verbatim} |
| 526 |
Or via wget pipe: |
| 527 |
\begin{Verbatim}[label=download and write a new firmware-file into flash] |
| 528 |
# wget -O - http://www.yourserver.com/freewrt.bin | mtd -e linux -r write - linux & |
| 529 |
\end{Verbatim} |
| 530 |
The parameters explained in detail: |
| 531 |
\begin{description} |
| 532 |
\item[\command{-e linux}] erase existing data in flash |
| 533 |
\item[\command{-r}] trigger rebooting right after finishing work |
| 534 |
\item[\command{write}] write the firmware image contained in the file |
| 535 |
given as next parameter to flash |
| 536 |
\item[\command{freewrt.bin}] the actual image to write -- ignore the |
| 537 |
suffix, it is detected at runtime |
| 538 |
\item[\command{linux}] this is an abstract identifier for a certain |
| 539 |
partition in flash, so don't change this |
| 540 |
\item[\command{\&}] put the process into background, to prevent |
| 541 |
accidentally stopping |
| 542 |
\end{description} |
| 543 |
|
| 544 |
\subsection{Installation using TFTP}\label{sec:tftp} |
| 545 |
|
| 546 |
All supported target devices are shipped with a builtin bootloader, comparable |
| 547 |
to the BIOS of \term{x86} machines. This bootloader is used to bootstrap the |
| 548 |
system until it can boot a regular operating system. Besides the ability to |
| 549 |
load the executable code from flash, it can be received from another node in |
| 550 |
the local area network via the famous TFTP protocol. |
| 551 |
|
| 552 |
For doing this, there are two ways: |
| 553 |
\begin{itemize} |
| 554 |
\item the device acts as a client, asks the local \app{dhcpd} for a |
| 555 |
lease, the address of the next \app{tftpd} and the filename to |
| 556 |
download |
| 557 |
\item the device acts as a server, having a known IP address and |
| 558 |
waiting for any TFTP client to connect and send the file |
| 559 |
\end{itemize} |
| 560 |
|
| 561 |
Most of the hardware supported by FreeWRT 1.0 uses the second method. Only the |
| 562 |
device \term{Netgear WGT634u} is using the first method, the bootloader |
| 563 |
provides a DHCP/TFTP client. Though this may be a little confusing to people |
| 564 |
being familiar with netboot technologies, it is definitely the easier way of |
| 565 |
doing it. Otherwise one had to setup both DHCP and TFTP servers and configure |
| 566 |
them right. |
| 567 |
|
| 568 |
The even quite simple task of sending the flash image to the target device is |
| 569 |
made even more easy by providing a little shell script for the job. Invocation |
| 570 |
is as follows: |
| 571 |
\begin{Verbatim}[label=sending the new firmware via TFTP] |
| 572 |
$ ./scripts/flash.sh firmware.bin [address] |
| 573 |
\end{Verbatim} |
| 574 |
The second Parameter \code{address} is used to specify a different IP address |
| 575 |
of the target device than the default \file{192.168.1.1}. |
| 576 |
|
| 577 |
\strong{Beware:} do not rename the firmware image before flashing it using the |
| 578 |
script as the original name is parsed to guess what hardware is to be flashed. |
| 579 |
|
| 580 |
To actually being able to flash the device, it has to wait for a tftp |
| 581 |
connection when booting. To complicate installation of third vendor's firmware |
| 582 |
images and to improve bootup time, of course, this feature is disabled by |
| 583 |
default. The following list shows what has to be done for a certain device to |
| 584 |
get it to wait at boot: \\ |
| 585 |
\begin{center} |
| 586 |
\begin{tabular}{l|l|p{7cm}} % TODO: fill this table |
| 587 |
\strong{Target Device} & \strong{Action to be taken} & \strong{Comments} \\ |
| 588 |
\hline |
| 589 |
All supported Linksys models & Ping Exploit & nvram variable \code{boot\_wait} |
| 590 |
needs to be on \\ |
| 591 |
All supported Asus models & Recovery mode & power off $\rightarrow$ push and |
| 592 |
hold the reset button $\rightarrow$ |
| 593 |
power on $\rightarrow$ power led is |
| 594 |
flashing \\ |
| 595 |
\end{tabular} |
| 596 |
\end{center} |
| 597 |
|
| 598 |
\chapter{FreeWRT Administration}\label{ch:administration} |
| 599 |
|
| 600 |
After the FreeWRT firmware image has been built by the ADK and later flashed |
| 601 |
onto the hardware, the resulting operating system has to be configured. This |
| 602 |
section provides the necessary information to do that, including tips and |
| 603 |
guides for using FreeWRT in general, of course. |
| 604 |
|
| 605 |
\section{Network Configuration} |
| 606 |
|
| 607 |
The device names for real network interfaces in Linux are named \code{ethx} (\code{x} is |
| 608 |
\code{0--9}). If the device has a switch, the different ports are separated via VLAN |
| 609 |
technology. The vlan interfaces are named \code{ethx.y}. The network configuration in |
| 610 |
FreeWRT is managed via \app{Busybox}'s \app{ifupdown} implementation. \app{Busybox}'s builtin \app{ip} |
| 611 |
command configures the network interfaces. There is no \app{ifconfig} or \app{route}, you can activate |
| 612 |
it in the ADK menue, if you like. |
| 613 |
|
| 614 |
To show all configured network interfaces use: |
| 615 |
\begin{Verbatim}[label=show IP address] |
| 616 |
$ ip addr show |
| 617 |
\end{Verbatim} |
| 618 |
To show the kernel routing table use: |
| 619 |
\begin{Verbatim}[label=show routing table] |
| 620 |
$ ip route show |
| 621 |
\end{Verbatim} |
| 622 |
|
| 623 |
All available network settings can be found in \file{/etc/network/interfaces} |
| 624 |
which has the common form: |
| 625 |
\begin{Verbatim}[label=common form of \file{/etc/network/interfaces}] |
| 626 |
auto <iface-name> |
| 627 |
iface <iface-name> inet <method> |
| 628 |
<option-x> <value> |
| 629 |
<option-y> <value> |
| 630 |
<option-z> <value> |
| 631 |
\end{Verbatim} |
| 632 |
|
| 633 |
<b>ATTENTION: Be sure you have no whitespaces at the and of any value!</b> |
| 634 |
|
| 635 |
\code{auto <iface-name>} is optional and, if set, tells the \app{ifup} script to |
| 636 |
start this interface automatically on bootup. |
| 637 |
|
| 638 |
Each interface needs a unique name which, depending on the method, represents |
| 639 |
either a physical interface or a logical interface name like \code{eth0.1} for |
| 640 |
a physical VLAN or \code{umts} as a logical name for a PPP interface. |
| 641 |
|
| 642 |
Possible methods are: |
| 643 |
\begin{description} |
| 644 |
\item[static] use the given options to configure the interface |
| 645 |
statically |
| 646 |
\item[dhcp] just start a dhcp client using the interface |
| 647 |
\code{iface-name} |
| 648 |
\item[manual] don't configure the interface but start \code{pre-up.d} |
| 649 |
hook scripts |
| 650 |
\item[ppp] run \code{pon <provider>} where \code{<provider>} is given |
| 651 |
as an interface option |
| 652 |
\end{description} |
| 653 |
|
| 654 |
\subsection{Switch/VLAN} |
| 655 |
The switch built-in into the most routers is capable of separating each port |
| 656 |
using VLAN tagging. You can configure the switch by simply adding the interface |
| 657 |
to the config file and giving the desired switch-ports: |
| 658 |
\begin{Verbatim}[label=\file{/etc/network/interfaces}] |
| 659 |
auto eth0.0 |
| 660 |
iface eth0.0 inet static |
| 661 |
switch-ports 1 2 5* |
| 662 |
address 192.168.1.1 |
| 663 |
netmask 255.255.255.0 |
| 664 |
|
| 665 |
auto eth0.1 |
| 666 |
iface eth0.1 inet static |
| 667 |
switch-ports 3 4 5 |
| 668 |
address 192.168.2.1 |
| 669 |
netmask 255.255.255.0 |
| 670 |
|
| 671 |
auto eth0.2 |
| 672 |
iface eth0.2 inet static |
| 673 |
switch-ports 0 5 |
| 674 |
address 172.16.1.42 |
| 675 |
netmask 255.255.255.0 |
| 676 |
gateway 172.16.1.1 |
| 677 |
\end{Verbatim} |
| 678 |
|
| 679 |
This configures three VLAN interfaces \code{eth0.0} on ports 1 and 2, |
| 680 |
\code{eth0.1} on port 3 and 4 and \code{eth0.2} on port 0. |
| 681 |
|
| 682 |
|
| 683 |
If you need to do some advanced settings, because you have for example a |
| 684 |
powerful switch with a VLAN trunking port connected to one of your switch |
| 685 |
ports, the configuration would look like this: |
| 686 |
|
| 687 |
\begin{Verbatim}[label=\file{/etc/network/interfaces}] |
| 688 |
auto eth0.1 |
| 689 |
iface eth0.1 inet static |
| 690 |
switch-ports 2 3 4 5* |
| 691 |
address 192.168.1.1 |
| 692 |
netmask 255.255.255.0 |
| 693 |
|
| 694 |
auto eth0.2 |
| 695 |
iface eth0.2 inet static |
| 696 |
switch-ports 1t 5 |
| 697 |
address 10.2.0.1 |
| 698 |
netmask 255.255.255.0 |
| 699 |
broadcast + |
| 700 |
|
| 701 |
auto eth0.3 |
| 702 |
iface eth0.3 inet static |
| 703 |
switch-ports 1t 5 |
| 704 |
address 10.3.0.1 |
| 705 |
netmask 255.255.255.0 |
| 706 |
broadcast + |
| 707 |
|
| 708 |
auto eth0.4 |
| 709 |
iface eth0.4 inet static |
| 710 |
switch-ports 1t 5 |
| 711 |
address 10.4.0.1 |
| 712 |
netmask 255.255.255.0 |
| 713 |
broadcast + |
| 714 |
|
| 715 |
\end{Verbatim} |
| 716 |
|
| 717 |
This configures four VLAN interfaces, \code{eth0.1} on physical ports 2, 3 and |
| 718 |
4. The interfaces \code{eth0.2}, \code{eth0.3} and \code{eth0.4} are three |
| 719 |
different networks with VLAN ID 2--4. The physical port 1 needs to be connected |
| 720 |
to a VLAN trunking port on a switch with knows the same VLAN IDs. |
| 721 |
|
| 722 |
|
| 723 |
Explanation: |
| 724 |
\begin{description} |
| 725 |
\item[port 0] this is typically the port labeled as WAN |
| 726 |
\item[port 1--4] these are typically the ports labeled as LAN |
| 727 |
\item[port 5] this special port represents the port where the |
| 728 |
router--board is connected to the switch |
| 729 |
\item[*] one interface always need an asterisk behind port 5 which |
| 730 |
means it is the default interface and gets all the packages |
| 731 |
with unknown tags. |
| 732 |
\end{description} |
| 733 |
|
| 734 |
\subsection{Static IP configuration} |
| 735 |
As you can see in the VLAN example three interfaces were configured with static |
| 736 |
IP settings, so these are the commonly used options: |
| 737 |
\begin{description} |
| 738 |
\item[address] the IP address --- required |
| 739 |
\item[netmask] the netmask --- required |
| 740 |
\item[broadcast] broadcast address --- only required for legacy |
| 741 |
applications (if using \code{+}, it will be calculated |
| 742 |
automatically by the kernel) |
| 743 |
\item[gateway] an IP address added as default gateway if present |
| 744 |
\item[mac-address] if you need to change your MAC address (required for |
| 745 |
some DSL providers) |
| 746 |
\end{description} |
| 747 |
|
| 748 |
\subsection{DHCP} |
| 749 |
That's just as simple as: |
| 750 |
\begin{Verbatim}[label=\file{/etc/network/interfaces}] |
| 751 |
auto eth0.1 |
| 752 |
iface eth0.1 inet dhcp |
| 753 |
switch-ports 0 5 |
| 754 |
\end{Verbatim} |
| 755 |
Typically this configures the WAN-Port to start a DHCP request on bootup. |
| 756 |
|
| 757 |
\subsection{WLAN} |
| 758 |
A router containing a WLAN interface has an additional ethernet device |
| 759 |
representing it. On Broad\-com-based hardware it is typically \code{eth1} |
| 760 |
(\term{Linksys}),\code{eth2} (\term{Asus WL500gP}) or on \term{Netgear WGT634u} |
| 761 |
which has a Madwifi WLAN chip, it is \code{ath0}, \code{ath1}, etc. You can use |
| 762 |
these interfaces standalone or bridged with other devices, e.g. the internal |
| 763 |
LAN. |
| 764 |
|
| 765 |
\subsubsection{Basic Settings} |
| 766 |
|
| 767 |
Mandatory options and default parameters are in bold font. |
| 768 |
|
| 769 |
\begin{tabular}{l|l|p{10cm}} |
| 770 |
\strong{Option} & \strong{Parameter} & \strong{Description} \\ |
| 771 |
\hline\hline |
| 772 |
\code{\strong{type}} & \code{broadcom} & Broadcom based card \\ |
| 773 |
& \code{atheros} & Madwifi driver \\ |
| 774 |
\hline |
| 775 |
\code{\strong{mode}} & \code{ap} & Access point mode \\ |
| 776 |
& \code{sta} & Client mode \\ |
| 777 |
& \code{adhoc} & Ad-Hoc mode \\ |
| 778 |
& \code{wds} & WDS point-to-point link over wireless\\ |
| 779 |
& \code{monitor} & The node acts as a passive monitor and |
| 780 |
only receives packets \\ |
| 781 |
\hline |
| 782 |
\code{\strong{ssid}} & \code{<String>} & Set the SSID (Network Name) \\ |
| 783 |
\hline |
| 784 |
\code{country} & \code{\{ALL|DE|JP|US|\ldots\}} & The country code used |
| 785 |
to determine the |
| 786 |
regulatory settings. \\ |
| 787 |
\hline |
| 788 |
\end{tabular} |
| 789 |
|
| 790 |
\subsubsection{Security Settings} |
| 791 |
\begin{longtable}{l|l|p{10cm}} |
| 792 |
\strong{Option} & \strong{Parameter} & \strong{Description} \\ |
| 793 |
\hline\hline |
| 794 |
\code{\strong{security}} & \code{none} & No authorization \\ |
| 795 |
& \code{wep} & WEP key \\ |
| 796 |
& \code{wpa-psk} & WPA with preshared key \\ |
| 797 |
& \code{8021x} & IEEE 802.1X authentication \\ |
| 798 |
\hline |
| 799 |
\code{\strong{authorization}} & & \strong{wpa-psk} \\ |
| 800 |
& \code{psk} & WPA PSK \\ |
| 801 |
& \code{psk2} & WPA2 PSK \\ |
| 802 |
& \code{psk psk2} & WPA PSK and WPA2 PSK \\ |
| 803 |
& & \strong{8021x} \\ |
| 804 |
& \code{wpa} & WPA with RADIUS \\ |
| 805 |
& \code{wpa2} & WPA2 with RADIUS \\ |
| 806 |
& \code{wpa wpa2} & WPA and WPA2 \\ |
| 807 |
\hline |
| 808 |
\code{\strong{encryption}} & & \strong{wep} \\ |
| 809 |
& --- & not needed, automatically by key size \\ |
| 810 |
& & \strong{wpa-psk} \\ |
| 811 |
& \code{tkip} & RC4 encryption \\ |
| 812 |
& \code{aes} & AES encryption \\ |
| 813 |
& \code{aes+tkip} & support both \\ |
| 814 |
& & \strong{8021x} \\ |
| 815 |
& \code{wep} & RC4 encryption (static) \\ |
| 816 |
& \code{tkip} & RC4 encryption \\ |
| 817 |
& \code{aes} & AES encryption \\ |
| 818 |
& \code{aes+tkip} & support both \\ |
| 819 |
\hline |
| 820 |
\code{eap-type} & & \strong{8021x} \\ |
| 821 |
& \code{\strong{tls}} & Transport Layer Security \\ |
| 822 |
& \code{ttls} & Tunnelled TLS \\ |
| 823 |
& \code{peap} & Protected EAP \\ |
| 824 |
& \code{leap} & Cisco Wireless \\ |
| 825 |
\hline |
| 826 |
\code{key} & & \strong{wep} \\ |
| 827 |
&\code{\{\strong{1}|2|3|4\}} & Select WEP key to use. \\ |
| 828 |
\hline |
| 829 |
\code{key[1..4]} & & \strong{wep} \\ |
| 830 |
& \code{<String>} & WEP key. The key must be 5, 13 or 16 |
| 831 |
bytes long, or 10, 26, 32, or 64 hex |
| 832 |
digits long. The encryption algorithm is |
| 833 |
automatically selected based on the key |
| 834 |
size. key1 is the key for WEP client mode. |
| 835 |
\\ |
| 836 |
\hline |
| 837 |
\code{wpa-key} & & \strong{wpa-psk} \\ |
| 838 |
& <String> & Password to use with WPA/WPA2 PSK (at least 8, up |
| 839 |
to 63 chars) \\ |
| 840 |
\hline |
| 841 |
\code{wpa-gtk-rekey} & & \strong{wpa-psk}, |
| 842 |
\strong{8021x} \\ |
| 843 |
& \code{<Int>} (\strong{3600}) & Rekeying interval in |
| 844 |
seconds. \\ |
| 845 |
\hline |
| 846 |
\code{\strong{radius-ipaddr}} & & \strong{8021x} \\ |
| 847 |
& \code{<a.b.c.d>} & IP to connect. \\ |
| 848 |
\hline |
| 849 |
\code{radius-port} & & \strong{8021x} \\ |
| 850 |
& \code{<Int>} (\strong{1812}) & RADIUS-Port no. to connect |
| 851 |
\\ |
| 852 |
\hline |
| 853 |
\strong{radius-key} & & \strong{8021x} \\ |
| 854 |
& \code{<String>} & Shared Secret for connection to the |
| 855 |
Radius server \\ |
| 856 |
\hline |
| 857 |
\end{longtable} |
| 858 |
|
| 859 |
\subsubsection{MAC filter} |
| 860 |
\begin{tabular}{l|l|p{10cm}} |
| 861 |
\strong{Option} & \strong{Parameter} & \strong{Description} \\ |
| 862 |
\hline\hline |
| 863 |
\code{macmode} & \code{\{0|1|2\}} & 0: Disable MAC address matching. \\ |
| 864 |
& & 1: Deny association to stations on the MAC |
| 865 |
list. \\ |
| 866 |
& & 2: Allow association to stations on the MAC |
| 867 |
list. \\ |
| 868 |
\hline |
| 869 |
\code{maclist} & \code{<MAC1> \ldots <MACn>} & List of space separated mac |
| 870 |
addresses to allow/deny |
| 871 |
according to \code{macmode}. |
| 872 |
Addresses should be entered with |
| 873 |
colons, e.g.: |
| 874 |
"\code{00:02:2D:08:E2:1D |
| 875 |
00:03:3E:05:E1:1B}"\\ |
| 876 |
\end{tabular} |
| 877 |
|
| 878 |
\subsubsection{Wireless Distribution System (WDS)} |
| 879 |
\begin{tabular}{l|l|p{10cm}} |
| 880 |
\strong{Option} & \strong{Parameter} & \strong{Description} \\ |
| 881 |
\hline\hline |
| 882 |
\code{lazywds} & \code{\{0|1\}} & Accept WDS connections |
| 883 |
from anyone \\ |
| 884 |
\hline |
| 885 |
\code{wds-bridge} & \code{br\{X\}} & Add WDS peers to bridge |
| 886 |
brX \\ |
| 887 |
\hline |
| 888 |
\code{wds-security} & \code{\{wpa-psk\}} & secure the wds bridge |
| 889 |
with WPA (optional)\\ |
| 890 |
\hline |
| 891 |
\code{wds-encryption} & \code{\{aes|tkip\}} & Use AES or TKIP as |
| 892 |
cipher\\ |
| 893 |
\hline |
| 894 |
\code{wds-wpa-key} & \code{<String>} & Password to use with WPA |
| 895 |
PSK (at least 8, up to 63 |
| 896 |
chars) \\ |
| 897 |
\hline |
| 898 |
\code{wds} & \code{<MAC1> \ldots <MACn>} & List of WDS peer mac |
| 899 |
addresses |
| 900 |
(\code{xx:xx:xx:xx:xx:xx}, |
| 901 |
space separated) \\ |
| 902 |
\hline |
| 903 |
\end{tabular} |
| 904 |
|
| 905 |
\subsubsection{Miscellaneous} |
| 906 |
\begin{longtable}{l|l|p{10cm}} |
| 907 |
\strong{Option} & \strong{Parameter} & \strong{Description} \\ |
| 908 |
\hline\hline |
| 909 |
\code{channel} & \code{\{1--14\}} & The wifi channel \\ |
| 910 |
\hline |
| 911 |
\code{maxassoc} & \code{\{1--255\}} & Maximum number of associated clients \\ |
| 912 |
\hline |
| 913 |
% TODO: add descriptions to the different gmode settings |
| 914 |
\code{gmode} & & Set the 54g Mode \\ |
| 915 |
& \code{\strong{Auto}} & default \\ |
| 916 |
& \code{LegacyB} & \\ |
| 917 |
& \code{GOnly} & \\ |
| 918 |
& \code{BDeferred} & \\ |
| 919 |
& \code{Performance} & \\ |
| 920 |
& \code{LRS} & \\ |
| 921 |
\hline |
| 922 |
\code{frameburst} & \code{\{\strong{0}|1\}} & Disable/Enable frameburst mode. \\ |
| 923 |
\hline |
| 924 |
\code{txpower} & \code{\{0--255|\strong{$-1$}\}} & Set the transmit power in dBm \\ |
| 925 |
\hline |
| 926 |
\code{rate} & \code{<Int> (\strong{$-1$})} & force a fixed rate \\ |
| 927 |
& & valid values for 802.11a are (6, |
| 928 |
9, 12, 18, 24, 36, 48, 54) \\ |
| 929 |
& & valid values for 802.11b are (1, |
| 930 |
2, 5.5, 11) \\ |
| 931 |
& & valid values for 802.11g are (1, |
| 932 |
2, 5.5, 6, 9, 11, 12, 18, 24, 36, |
| 933 |
48, 54) \\ |
| 934 |
& & $-1$ means automatically determine |
| 935 |
the best rate \\ |
| 936 |
\hline |
| 937 |
\code{rts} & \code{\{0-2347\}} & Set the RTS threshhold. \\ |
| 938 |
\hline |
| 939 |
\code{frag} & \code{\{256-2346\}} & Set the fragmentation |
| 940 |
threshhold. \\ |
| 941 |
\hline |
| 942 |
\code{afterburner} & \code{\{\strong{0}|1\}} & Enable Afterburner capability |
| 943 |
\\ |
| 944 |
\hline |
| 945 |
\code{isolate} & \code{\{\strong{0}|1\}} & Hide Clients from each other \\ |
| 946 |
\hline |
| 947 |
\code{bridge-if} & \code{\{br0..brX\}} & The bridge interface (optional) |
| 948 |
\\ |
| 949 |
\hline |
| 950 |
\end{longtable} |
| 951 |
|
| 952 |
\subsubsection{Examples for wireless configuration} |
| 953 |
|
| 954 |
\paragraph{WLAN with WPA1/WPA2 AES+TKIP} |
| 955 |
|
| 956 |
This combination works with any kind of WPA client implementation. |
| 957 |
|
| 958 |
\begin{Verbatim}[label=\file{/etc/network/interfaces}] |
| 959 |
auto eth1 |
| 960 |
iface eth1 inet static |
| 961 |
address 192.168.10.1 |
| 962 |
netmask 255.255.255.0 |
| 963 |
broadcast + |
| 964 |
wireless-type broadcom |
| 965 |
wireless-country DE |
| 966 |
wireless-mode ap |
| 967 |
wireless-ssid FreeWRT |
| 968 |
wireless-security wpa-psk |
| 969 |
wireless-authorization psk psk2 |
| 970 |
wireless-encryption aes+tkip |
| 971 |
wireless-wpa-key 12345678 |
| 972 |
wireless-channel 11 |
| 973 |
\end{Verbatim} |
| 974 |
|
| 975 |
If you want to do MAC filtering, add the following to the sample above: |
| 976 |
\begin{Verbatim}[label=\file{/etc/network/interfaces}] |
| 977 |
wireless-macmode 2 |
| 978 |
wireless-mac 00:01:02:03:04:05 06:07:08:09:0a:0b |
| 979 |
\end{Verbatim} |
| 980 |
this enables the filter and defines the list to contain addresses that should be allowed. |
| 981 |
|
| 982 |
\paragraph{WLAN without encryption} |
| 983 |
|
| 984 |
If you already use VPN to secure your connection, you can just use an unencrypted setup |
| 985 |
and setup the firewall on your embedded device. |
| 986 |
|
| 987 |
\begin{Verbatim}[label=\file{/etc/network/interfaces}] |
| 988 |
auto eth1 |
| 989 |
iface eth1 inet static |
| 990 |
address 192.168.10.1 |
| 991 |
netmask 255.255.255.0 |
| 992 |
broadcast + |
| 993 |
wireless-type broadcom |
| 994 |
wireless-country DE |
| 995 |
wireless-mode ap |
| 996 |
wireless-ssid FreeWRT |
| 997 |
wireless-security none |
| 998 |
wireless-channel 11 |
| 999 |
\end{Verbatim} |
| 1000 |
|
| 1001 |
\paragraph{WLAN client with WPA2 (AES)} |
| 1002 |
|
| 1003 |
This can only be used in routing mode, you can not bridge it with LAN or WAN interfaces. |
| 1004 |
|
| 1005 |
\begin{Verbatim}[label=\file{/etc/network/interfaces}] |
| 1006 |
auto eth1 |
| 1007 |
iface eth1 inet static |
| 1008 |
address 192.168.10.1 |
| 1009 |
netmask 255.255.255.0 |
| 1010 |
broadcast + |
| 1011 |
wireless-type broadcom |
| 1012 |
wireless-country DE |
| 1013 |
wireless-mode sta |
| 1014 |
wireless-ssid FreeWRT |
| 1015 |
wireless-security wpa-psk |
| 1016 |
wireless-authorization psk2 |
| 1017 |
wireless-encryption aes |
| 1018 |
wireless-wpa-key 12345678 |
| 1019 |
\end{Verbatim} |
| 1020 |
|
| 1021 |
WLAN with WDS nodes, the WDS nodes need to have the same |
| 1022 |
SSID, channel and encryption parameters. The WDS connection is separetely |
| 1023 |
secured via WPA1 and AES. WPA2 for WDS connection security is \_not\_ working. |
| 1024 |
|
| 1025 |
WDS node 1 (MAC of Wireless \code{06:05:04:03:02:01}) |
| 1026 |
\begin{Verbatim}[label=\file{/etc/network/interfaces}] |
| 1027 |
auto br0 |
| 1028 |
iface br0 inet static |
| 1029 |
bridge-ifaces eth1 |
| 1030 |
address 192.168.10.1 |
| 1031 |
netmask 255.255.255.0 |
| 1032 |
broadcast + |
| 1033 |
wireless-type broadcom |
| 1034 |
wireless-country DE |
| 1035 |
wireless-mode wds |
| 1036 |
wireless-ssid FreeWRT-WDS |
| 1037 |
wireless-security wpa-psk |
| 1038 |
wireless-authorization psk psk2 |
| 1039 |
wireless-encryption aes+tkip |
| 1040 |
wireless-wpa-key apkey |
| 1041 |
wireless-lazywds 1 |
| 1042 |
wireless-wds-security wpa-psk |
| 1043 |
wireless-wds-encryption aes |
| 1044 |
wireless-wds-wpa-key wdskey |
| 1045 |
wireless-wds 01:02:03:04:05:06 |
| 1046 |
wireless-wds-bridge br0 |
| 1047 |
\end{Verbatim} |
| 1048 |
WDS node 2 (MAC of Wireless \code{01:02:03:04:05:06}) |
| 1049 |
\begin{Verbatim}[label=\file{/etc/network/interfaces}] |
| 1050 |
auto br0 |
| 1051 |
iface br0 inet static |
| 1052 |
bridge-ifaces eth1 |
| 1053 |
address 192.168.10.2 |
| 1054 |
netmask 255.255.255.0 |
| 1055 |
broadcast + |
| 1056 |
wireless-type broadcom |
| 1057 |
wireless-country DE |
| 1058 |
wireless-mode wds |
| 1059 |
wireless-ssid FreeWRT-WDS |
| 1060 |
wireless-security wpa-psk |
| 1061 |
wireless-authorization psk psk2 |
| 1062 |
wireless-encryption aes+tkip |
| 1063 |
wireless-wpa-key apkey |
| 1064 |
wireless-lazywds 1 |
| 1065 |
wireless-wds-security wpa-psk |
| 1066 |
wireless-wds-encryption aes |
| 1067 |
wireless-wds-wpa-key wdskey |
| 1068 |
wireless-wds 06:05:04:03:02:01 |
| 1069 |
wireless-wds-bridge br0 |
| 1070 |
\end{Verbatim} |
| 1071 |
|
| 1072 |
\paragraph{Peer-to-Peer/AdHoc mode (no encryption, IP must be static)} |
| 1073 |
\begin{Verbatim}[label=\file{/etc/network/interfaces}] |
| 1074 |
auto eth1 |
| 1075 |
iface eth1 inet static |
| 1076 |
address 192.168.10.1 |
| 1077 |
netmask 255.255.255.0 |
| 1078 |
broadcast + |
| 1079 |
wireless-type broadcom |
| 1080 |
wireless-country DE |
| 1081 |
wireless-mode adhoc |
| 1082 |
wireless-ssid FreeWRT |
| 1083 |
wireless-security none |
| 1084 |
wireless-channel 11 |
| 1085 |
\end{Verbatim} |
| 1086 |
|
| 1087 |
\subsection{Bridging} |
| 1088 |
|
| 1089 |
This is mostly needed to combine LAN and WLAN to a homogeneous network. |
| 1090 |
Be sure you have installed the package \app{bridge-utils}. |
| 1091 |
See the example for a bridging setup, WLAN is secured via WPA/WPA2. |
| 1092 |
|
| 1093 |
\begin{Verbatim}[label=\file{/etc/network/interfaces}] |
| 1094 |
auto eth0.0 |
| 1095 |
iface eth0.0 inet manual |
| 1096 |
switch-ports 1 2 3 4 5* |
| 1097 |
|
| 1098 |
auto eth1 |
| 1099 |
iface eth1 inet manual |
| 1100 |
wireless-type broadcom |
| 1101 |
wireless-country DE |
| 1102 |
wireless-mode ap |
| 1103 |
wireless-ssid FreeWRT |
| 1104 |
wireless-channel 11 |
| 1105 |
wireless-security wpa-psk |
| 1106 |
wireless-authorization psk psk2 |
| 1107 |
wireless-encryption aes+tkip |
| 1108 |
wireless-wpa-key MyWlanSecret |
| 1109 |
wireless-bridge-if br0 |
| 1110 |
|
| 1111 |
auto br0 |
| 1112 |
iface br0 inet static |
| 1113 |
bridge-ifaces eth0.0 eth1 |
| 1114 |
address 192.168.1.1 |
| 1115 |
netmask 255.255.255.0 |
| 1116 |
broadcast + |
| 1117 |
\end{Verbatim} |
| 1118 |
|
| 1119 |
This creates a new bridging interface \code{br0} which combines the VLAN |
| 1120 |
interface \code{eth0.0} (representing the LAN-ports 1--4) and the WLAN interface |
| 1121 |
\code{eth1} (on some devices like \term{Asus WL500gP} this might be \code{eth2}). |
| 1122 |
The bridge interface needs always be the last one, otherwise it can not find |
| 1123 |
the interfaces in \code{bridge-ifaces}. |
| 1124 |
|
| 1125 |
\subsection{PPP} |
| 1126 |
|
| 1127 |
PPP comes in various flavours for different situations, the most commonly |
| 1128 |
needed will likely be DSL and for \term{WRT54G3G} users UMTS. So there exists a |
| 1129 |
hook-script that evaluates a \code{use-template} option and generates a |
| 1130 |
ppp-peer. This way everything needed so far can be configured within the |
| 1131 |
\code{interfaces} file. Be sure you have installed the packages \app{kmod-ppp}, |
| 1132 |
\app{ppp} and \app{ppp-mod-pppoe}. For providers using PPTP for authentication, |
| 1133 |
instead of PPPoE, you need to install \app{pptp}. |
| 1134 |
|
| 1135 |
\subsubsection{DSL with PPPoE} |
| 1136 |
\begin{Verbatim}[label=\file{/etc/network/interfaces}] |
| 1137 |
auto ppp0 |
| 1138 |
iface ppp0 inet ppp |
| 1139 |
use-template dsl |
| 1140 |
provider foobar |
| 1141 |
ppp-username 1234567890121234567890120001@bar.de |
| 1142 |
ppp-password bar |
| 1143 |
ppp-device eth0.1 |
| 1144 |
\end{Verbatim} |
| 1145 |
|
| 1146 |
Now your DSL connection will be started on boot (\code{auto ppp0}) and you can |
| 1147 |
manually shut it down with \command{ifdown ppp0} or start it up with |
| 1148 |
\command{ifup ppp0}. The template \code{dsl} will configure a typical PPPoE |
| 1149 |
peer for you. |
| 1150 |
|
| 1151 |
\subsubsection{DSL with PPTP} |
| 1152 |
\begin{Verbatim}[label=\file{/etc/network/interfaces}] |
| 1153 |
auto ppp0 |
| 1154 |
iface ppp0 inet ppp |
| 1155 |
use-template pptp |
| 1156 |
provider foobar |
| 1157 |
ppp-username foo |
| 1158 |
ppp-password bar |
| 1159 |
ppp-modemip 10.0.0.1 |
| 1160 |
ppp-mtu 1480 |
| 1161 |
ppp-device eth0.1 |
| 1162 |
\end{Verbatim} |
| 1163 |
|
| 1164 |
Now your DSL connection will be started on boot (\code{auto ppp0}) and you can |
| 1165 |
manually shut it down with \command{ifdown ppp0} or start it up with |
| 1166 |
\command{ifup ppp0}. The template \code{pptp} will configure a typical PPTP |
| 1167 |
peer for you. |
| 1168 |
|
| 1169 |
\subsubsection{UMTS} |
| 1170 |
Same footprint different template and some specific options. That is all that |
| 1171 |
is needed for an UMTS connection to Vodafone as it can be seen in this example. |
| 1172 |
\begin{Verbatim}[label=\file{/etc/network/interfaces}] |
| 1173 |
iface ppp0 inet ppp |
| 1174 |
use-template umts |
| 1175 |
provider umts |
| 1176 |
#ppp-username "" |
| 1177 |
#ppp-password "" |
| 1178 |
ppp-device /dev/noz0 |
| 1179 |
umts-apn web.vodafone.de |
| 1180 |
umts-pincode 1234 |
| 1181 |
umts-mode umts_first |
| 1182 |
\end{Verbatim} |
| 1183 |
As you can see: unneeded options like \code{ppp-username} or |
| 1184 |
\code{ppp-password} can just be removed or commented out. Don't leave them |
| 1185 |
without a value as that causes a failure in \app{ipup}. It does work if you |
| 1186 |
give empty double quotes as value like \code{""}. |
| 1187 |
|
| 1188 |
Note that you have to set the correct APN, username and password for your |
| 1189 |
provider! |
| 1190 |
|
| 1191 |
You may also remove the pin from your SIM-card and the configuration if you |
| 1192 |
like. |
| 1193 |
|
| 1194 |
For \term{Linksys WRT54G3G} a package called \app{broadcom-watchbutton} will be |
| 1195 |
installed, this is a small daemon that monitors the UMTS-button of the router |
| 1196 |
and executes \command{ifup umts} or \command{ifdown umts} on a button press. |
| 1197 |
You have to set \code{watchbutton=YES} in /etc/rc.conf to have it start |
| 1198 |
automatically. |
| 1199 |
|
| 1200 |
This is totally independent from the \code{auto umts} setting. Even if you |
| 1201 |
start the connection on bootup you can shut it down again with a button press. |
| 1202 |
|
| 1203 |
\subsection{custom interface hooks} |
| 1204 |
\subsubsection{per interface} |
| 1205 |
You can execute various commands on interface startup or shutdown with special |
| 1206 |
option: |
| 1207 |
\begin{Verbatim}[label=\file{/etc/network/interfaces}] |
| 1208 |
iface foobar inet static |
| 1209 |
[...] |
| 1210 |
pre-up <command> |
| 1211 |
up <command> |
| 1212 |
up <command> |
| 1213 |
down <command> |
| 1214 |
post-down <command> |
| 1215 |
\end{Verbatim} |
| 1216 |
|
| 1217 |
You can give each option multiple times and their commands will be executed in |
| 1218 |
given order. |
| 1219 |
\begin{description} |
| 1220 |
\item[pre-up] before the interface will be started |
| 1221 |
\item[up] after the interface was started successfully |
| 1222 |
\item[down] before the interface goes down |
| 1223 |
\item[post-down] after the interface shut down |
| 1224 |
\end{description} |
| 1225 |
|
| 1226 |
\subsubsection{general hooks} |
| 1227 |
Additionally you can write scripts executed for each interface if you put them |
| 1228 |
in |
| 1229 |
\begin{itemize} |
| 1230 |
\item \texttt{/etc/network/if-pre-up.d} |
| 1231 |
\item \texttt{/etc/network/if-up.d} |
| 1232 |
\item \texttt{/etc/network/if-down.d} |
| 1233 |
\item \texttt{/etc/network/if-post-down.d} |
| 1234 |
\end{itemize} |
| 1235 |
Same semantics as above. |
| 1236 |
|
| 1237 |
|
| 1238 |
\section{Traffic Control} |
| 1239 |
|
| 1240 |
To aid in setting up Quality of Service and Traffic Shaping, FreeWRT provides a |
| 1241 |
configurable script via the \app{fwrtc} package. Though this package will allow |
| 1242 |
you to choose between different implementations of Queueing Disciplines, for |
| 1243 |
now there exists only a single implementation using HTB. |
| 1244 |
|
| 1245 |
\subsection{Concept} |
| 1246 |
|
| 1247 |
In general, \app{fwrtc} allows classifying of network traffic into three classes: |
| 1248 |
\begin{description} |
| 1249 |
\item[REAL] high priority, mid bandwidth \\ |
| 1250 |
use this for low delay applications like \app{SSH}, \app{VoIP} |
| 1251 |
or \app{DNS} |
| 1252 |
\item[BULK] mid priority, high bandwidth \\ |
| 1253 |
this is a generic class for everything that doesn't fit above |
| 1254 |
or below |
| 1255 |
\item[P2P] low priority, low bandwidth \\ |
| 1256 |
use this class for all unwanted traffic disturbing normal use |
| 1257 |
of the internet connection (\app{P2P} and other parasites) |
| 1258 |
\end{description} |
| 1259 |
|
| 1260 |
\paragraph{Note} that fwrtc does not actually classify the traffic, it just |
| 1261 |
provides the classes above and allows comfortable configuration of the |
| 1262 |
necessary values. For classifying traffic, use \app{iptables} (see below for |
| 1263 |
more details). |
| 1264 |
|
| 1265 |
\subsection{Installation} |
| 1266 |
|
| 1267 |
This is done just like with any other FreeWRT package, so using the ADK to |
| 1268 |
integrate it into the firmware image right from the start or by installing it |
| 1269 |
afterwards using \app{ipkg}. |
| 1270 |
|
| 1271 |
\subsection{Configuration} |
| 1272 |
|
| 1273 |
\app{fwrtc} basically exists of two files: |
| 1274 |
\begin{itemize} |
| 1275 |
\item the script itself \file{/etc/hotplug.d/net/10-fwrtc} |
| 1276 |
\item a configuration file \file{/etc/fwrtc.conf} |
| 1277 |
\end{itemize} |
| 1278 |
It should not be necessary to touch the hotplug script, so adjusting the |
| 1279 |
configuration values should be enough to complete the first part of the setup |
| 1280 |
process. |
| 1281 |
|
| 1282 |
The second part consists of defining \app{iptables} rules for classifying |
| 1283 |
traffic. \app{fwrtc} provides three \app{tc}-filters (one for each class), |
| 1284 |
matching different firewall marks (see the \code{MARK} target of |
| 1285 |
\app{iptables}). |
| 1286 |
|
| 1287 |
See the example below to gather some inspiration on how to actually |
| 1288 |
implementing the rules: |
| 1289 |
|
| 1290 |
\begin{Verbatim}[label=sample set of iptables rules for fwrtc] |
| 1291 |
iptables -t mangle -A POSTROUTING -o eth0 -j tc |
| 1292 |
|
| 1293 |
### match ip tos Minimum-Delay |
| 1294 |
iptables -t mangle -A tc -m tos --tos 0x10 -j MARK --set-mark 0x1 |
| 1295 |
iptables -t mangle -A tc -m tos --tos 0x10 -j RETURN |
| 1296 |
|
| 1297 |
## fish out tcp syn, syn-ack and ack packets (no piggyback!) |
| 1298 |
iptables -t mangle -A tc -p tcp -m length --length 44:84 \ |
| 1299 |
--tcp-flags SYN,FIN,RST SYN -j MARK --set-mark 0x1 |
| 1300 |
iptables -t mangle -A tc -p tcp -m length --length 44:84 \ |
| 1301 |
--tcp-flags SYN,FIN,RST SYN -j RETURN |
| 1302 |
iptables -t mangle -A tc -p tcp -m length --length 44:84 \ |
| 1303 |
--tcp-flags SYN,ACK,FIN,RST ACK -j MARK --set-mark 0x1 |
| 1304 |
iptables -t mangle -A tc -p tcp -m length --length 44:84 \ |
| 1305 |
--tcp-flags SYN,ACK,FIN,RST ACK -j RETURN |
| 1306 |
|
| 1307 |
### prioritize icmp packets |
| 1308 |
iptables -t mangle -A tc -p icmp -j MARK --set-mark 0x1 |
| 1309 |
iptables -t mangle -A tc -p icmp -j RETURN |
| 1310 |
|
| 1311 |
### dns traffic |
| 1312 |
iptables -t mangle -A tc -p tcp --dport 53 -j MARK --set-mark 0x1 |
| 1313 |
iptables -t mangle -A tc -p tcp --dport 53 -j RETURN |
| 1314 |
iptables -t mangle -A tc -p udp --dport 53 -j MARK --set-mark 0x1 |
| 1315 |
iptables -t mangle -A tc -p udp --dport 53 -j RETURN |
| 1316 |
|
| 1317 |
### games |
| 1318 |
iptables -t mangle -A tc -m layer7 --l7proto quake-halflife -j MARK --set-mark 0x1 |
| 1319 |
iptables -t mangle -A tc -m layer7 --l7proto quake-halflife -j RETURN |
| 1320 |
iptables -t mangle -A tc -m layer7 --l7proto battlefield1942 -j MARK --set-mark 0x1 |
| 1321 |
iptables -t mangle -A tc -m layer7 --l7proto battlefield1942 -j RETURN |
| 1322 |
iptables -t mangle -A tc -m layer7 --l7proto battlefield2 -j MARK --set-mark 0x1 |
| 1323 |
iptables -t mangle -A tc -m layer7 --l7proto battlefield2 -j RETURN |
| 1324 |
|
| 1325 |
### voip |
| 1326 |
iptables -t mangle -A tc -m layer7 --l7proto sip -j MARK --set-mark 0x1 |
| 1327 |
iptables -t mangle -A tc -m layer7 --l7proto sip -j RETURN |
| 1328 |
iptables -t mangle -A tc -m layer7 --l7proto rtp -j MARK --set-mark 0x1 |
| 1329 |
iptables -t mangle -A tc -m layer7 --l7proto rtp -j RETURN |
| 1330 |
iptables -t mangle -A tc -m layer7 --l7proto skypetoskype -j MARK --set-mark 0x1 |
| 1331 |
iptables -t mangle -A tc -m layer7 --l7proto skypetoskype -j RETURN |
| 1332 |
|
| 1333 |
### crappy p2p traffic |
| 1334 |
iptables -t mangle -A tc -m layer7 --l7proto bittorrent -j MARK --set-mark 0x3 |
| 1335 |
iptables -t mangle -A tc -m layer7 --l7proto bittorrent -j RETURN |
| 1336 |
iptables -t mangle -A tc -m layer7 --l7proto edonkey -j MARK --set-mark 0x3 |
| 1337 |
iptables -t mangle -A tc -m layer7 --l7proto edonkey -j RETURN |
| 1338 |
iptables -t mangle -A tc -m layer7 --l7proto fasttrack -j MARK --set-mark 0x3 |
| 1339 |
iptables -t mangle -A tc -m layer7 --l7proto fasttrack -j RETURN |
| 1340 |
iptables -t mangle -A tc -m layer7 --l7proto gnutella -j MARK --set-mark 0x3 |
| 1341 |
iptables -t mangle -A tc -m layer7 --l7proto gnutella -j RETURN |
| 1342 |
iptables -t mangle -A tc -m layer7 --l7proto napster -j MARK --set-mark 0x3 |
| 1343 |
iptables -t mangle -A tc -m layer7 --l7proto napster -j RETURN |
| 1344 |
\end{Verbatim} |
| 1345 |
|
| 1346 |
\section{FWCF - FreeWRT Configuration Filesystem} |
| 1347 |
|
| 1348 |
FWCF is a separate flash partition for all changes made to the \file{/etc/} |
| 1349 |
directory. There is a small tool named \app{fwcf}, which is used to setup the |
| 1350 |
system or to commit changes to the fwcf partition. |
| 1351 |
|
| 1352 |
On bootup the script \file{/sbin/mount\_root} is executed, which calls |
| 1353 |
\command{fwcf setup} to setup \file{/etc/} as memory filesystem and overlay the |
| 1354 |
changes committed to the fwcf partition. |
| 1355 |
|
| 1356 |
If you change anything in \file{/etc/} and like to keep the change, it is |
| 1357 |
required to execute \command{fwcf commit}. This will compress all changed or |
| 1358 |
new files in \file{/etc/} and write the result into the fwcf partition. The |
| 1359 |
fwcf partition is 128 Kb in size. This size is not changeable at the moment. |
| 1360 |
|
| 1361 |
If you need more detailed information, please read the specification of FWCF, |
| 1362 |
which can be found at |
| 1363 |
\url{http://www.freewrt.org/trac/wiki/Documentation/Specs/FwCf} |
| 1364 |
|
| 1365 |
If you want to remove all your changes and start your configuration from |
| 1366 |
scratch, use \command{fwcf erase}. This is also required if you switch between |
| 1367 |
compression plugins. Right now LZO plugin is default. |
| 1368 |
|
| 1369 |
\section{IPKG - Packagemanagement} |
| 1370 |
|
| 1371 |
All software for FreeWRT is available as a IPKG package. IPKG is a package |
| 1372 |
manager very similar to Debian's \app{dpkg/apt-get} utilities. It is specially |
| 1373 |
designed for embedded systems and is widely used. The FreeWRT project use a |
| 1374 |
special version, which is embedded to the busybox binary. Normally the command |
| 1375 |
line tool \app{ipkg} is pre-installed. |
| 1376 |
|
| 1377 |
IPKG uses a configuration file similar to \file{/etc/apt/sources.list}, which |
| 1378 |
contains a list of software repositories available via HTTP or FTP. The |
| 1379 |
configuration file \file{/etc/ipkg.conf} contains the official FreeWRT 1.0 |
| 1380 |
repository for your board and kernel version. |
| 1381 |
|
| 1382 |
To update the list of available packages execute following command as root: |
| 1383 |
\begin{Verbatim}[label=update list of available packages] |
| 1384 |
# ipkg update |
| 1385 |
\end{Verbatim} |
| 1386 |
|
| 1387 |
This command requires a working internet connection, because it will fetch a |
| 1388 |
package list from every repository declared in \file{/etc/ipkg.conf}. |
| 1389 |
|
| 1390 |
To install a new package use following command: |
| 1391 |
\begin{Verbatim}[label=example installation of \app{tcpdump}] |
| 1392 |
# ipkg install tcpdump |
| 1393 |
\end{Verbatim} |
| 1394 |
|
| 1395 |
This will install the package \app{tcpdump} and all dependencies onto the |
| 1396 |
flash. Where the data is saved depends on the root filesystem you decided to |
| 1397 |
use while installing FreeWRT. If you use jffs2 as root filesystem, then the |
| 1398 |
package is installed on the big linux partition. If you use squashfs-overlay, |
| 1399 |
then the package is installed on the mini-fo overlay filesystem which writes |
| 1400 |
its data to the jffs2 data partition. If you use a squashfs-symlinks |
| 1401 |
filesystem, then the package data is directly install into the jffs2 data |
| 1402 |
partition, containing symlinks to the read-only squashfs partition. |
| 1403 |
|
| 1404 |
You can also remove packages, but this is only useful if you are using jffs2 as |
| 1405 |
root filesystem: |
| 1406 |
\begin{Verbatim}[label=example removal of \app{tcpdump}] |
| 1407 |
# ipkg remove tcpdump |
| 1408 |
\end{Verbatim} |
| 1409 |
|
| 1410 |
This will not remove any dependencies, installed earlier. For example, |
| 1411 |
\app{libpcap} is still installed after executing this command. On jffs2 root |
| 1412 |
filesystem you should never remove any essential packages like \app{busybox}, |
| 1413 |
\app{fwcf} or \app{uclibc}, otherwise you make the embedded system unusable. |
| 1414 |
|
| 1415 |
Nearly the same as for removing packages, counts for \command{ipkg upgrade}. |
| 1416 |
Please \strong{never ever} use \command{ipkg upgrade} to update your embedded |
| 1417 |
system. This command is only useful to upgrade single packages on a jffs2 |
| 1418 |
rootfilesystem or data partition. |
| 1419 |
|
| 1420 |
\section{Startup scripts} |
| 1421 |
|
| 1422 |
Some of the available packages containing software which start services at boot |
| 1423 |
time. For that we provide simple startup scripts, which are installed into the |
| 1424 |
directory \file{/etc/init.d}. See following example for the package |
| 1425 |
\app{dnsmasq}, a combined dns and dhcp server daemon: |
| 1426 |
|
| 1427 |
\begin{Verbatim}[label=\file{/etc/init.d/S50dnsmasq}] |
| 1428 |
#!/bin/sh |
| 1429 |
|
| 1430 |
. /etc/rc.conf |
| 1431 |
|
| 1432 |
case $1 in |
| 1433 |
autostart) |
| 1434 |
test x"${dns_dhcp:-NO}" = x"NO" && exit 0 |
| 1435 |
exec $0 start |
| 1436 |
;; |
| 1437 |
start) |
| 1438 |
[ -f /etc/dnsmasq.conf ] || exit |
| 1439 |
/usr/sbin/dnsmasq |
| 1440 |
;; |
| 1441 |
stop) |
| 1442 |
killall dnsmasq |
| 1443 |
;; |
| 1444 |
restart) |
| 1445 |
$0 stop |
| 1446 |
$0 start |
| 1447 |
;; |
| 1448 |
*) |
| 1449 |
echo "Usage: $0 {start | stop | restart}" |
| 1450 |
;; |
| 1451 |
esac |
| 1452 |
exit 0 |
| 1453 |
\end{Verbatim} |
| 1454 |
|
| 1455 |
After installation the package postinst script will add all needed changes to |
| 1456 |
the \file{/etc/} directory. For example packages can add new user and groups, |
| 1457 |
add new variables to \file{/etc/rc.conf} or just add new values to existing |
| 1458 |
files as \file{/etc/services}. It is FreeWRT policy not to start any services |
| 1459 |
after installation or in case of a new boot. To start services on bootup you |
| 1460 |
need to set \code{\$servicename=YES} in \file{/etc/rc.conf} and commit your |
| 1461 |
changes via \command{fwcf commit}. For every policy exists an exception, we |
| 1462 |
start all essential services by default, like ssh daemon, syslog and network |
| 1463 |
initialisation. |
| 1464 |
|
| 1465 |
For some services you can control the startup behaviour by modifying the |
| 1466 |
\code{\$servicename\_flags} variable in \file{/etc/rc.conf}. |
| 1467 |
|
| 1468 |
For example the variable \code{\$ssh\_opts} is provided as an argument to the |
| 1469 |
dropbear ssh daemon to control its behaviour. |
| 1470 |
|
| 1471 |
Having this policy helps you to configure your FreeWRT embedded system without |
| 1472 |
shooting yourself in the foot. For example if you try to realize a firewall |
| 1473 |
system and trying to set the rules in \file{/etc/firewall.user}, which is read |
| 1474 |
by \file{/etc/init.d/S45firewall}, if the iptables package is installed. You |
| 1475 |
can just reload the changed ruleset via \code{/etc/init.d/S45firewall restart}. |
| 1476 |
If you managed to kick you out of the system, you can just reboot the system |
| 1477 |
and you gain access again. As soon as your are ready with the firewall |
| 1478 |
configuration and you decide to activate the firewall rules on bootup, you set |
| 1479 |
\code{firewall=YES} in \file{/etc/rc.conf}, commit your changes via |
| 1480 |
\command{fwcf commit} and reboot. Now the firewall rules will be activated on |
| 1481 |
bootup. |
| 1482 |
|
| 1483 |
\section{Network Logging} |
| 1484 |
|
| 1485 |
Administered networks often make use of a central Log Server to store the |
| 1486 |
SysLog output of the local servers. This is also a good approach when setting |
| 1487 |
up a Log Analyser or IDS. |
| 1488 |
|
| 1489 |
To enable sending SysLog output via network for \command{syslogd}, simply alter |
| 1490 |
it's flags in \file{/etc/rc.conf}. Use \code{-R Host[:Port]} to send all |
| 1491 |
messages to \code{Host}, and \code{Port} (optional). To keep the messages |
| 1492 |
locally also, give \code{-L} as additional flag. |
| 1493 |
|
| 1494 |
\section{Accessing USB storage devices} |
| 1495 |
|
| 1496 |
Many routers now ship with USB onboard, which makes them fine for dealing as a |
| 1497 |
fileserver. If you have such a device and want to setup your own low--cost NAS, |
| 1498 |
follow the instructions below. |
| 1499 |
|
| 1500 |
\subsection{Firmware image preparation} |
| 1501 |
|
| 1502 |
What you need is: |
| 1503 |
\begin{itemize} |
| 1504 |
\item kernel support for \code{usb-storage} |
| 1505 |
\item kernel support for the filesystem(s) to be used, e.g. \code{xfs} |
| 1506 |
\item optionally: \app{lsusb} to check for attached devices |
| 1507 |
\end{itemize} |
| 1508 |
|
| 1509 |
When all prerequisites are met, all that has to be done is to connect the USB |
| 1510 |
mass storage device to the USB port of the router. FreeWRT provides a |
| 1511 |
hotplugging script which mounts all connected partitions under |
| 1512 |
\file{/mnt/discN\_Y} while \code{N} is the index of the connected disk (i.e. |
| 1513 |
starting with 0) and \code{Y} is the number of the partition on the disk (i.e. |
| 1514 |
starting with 1). |
| 1515 |
|
| 1516 |
\subsection{Sharing storage via NFS} |
| 1517 |
|
| 1518 |
There are two implementations available, one residing in kernel space and |
| 1519 |
another one implemented purely in user space. If you wish to use the user space |
| 1520 |
implementation of NFS, just enable \app{nfs-server}. To use the kernel |
| 1521 |
implementation of NFS, activate \app{nfs-utils} for your target. Although |
| 1522 |
kernel space is somewhat faster, this implementation has the drawback that only |
| 1523 |
directory structures within a single mount point can be exported. So you have |
| 1524 |
to supply at least a single entry for each mounted partition in |
| 1525 |
\file{/etc/exports}. (Using the user space \app{nfsd}, you can also export the |
| 1526 |
complete \file{/mnt} directory. |
| 1527 |
|
| 1528 |
\begin{Verbatim}[label=sample /etc/exports] |
| 1529 |
/mnt/disc0_1 *(ro,no_root_squash,insecure,no_subtree_check) |
| 1530 |
/mnt/disc0_2 *(rw,root_squash,insecure,no_subtree_check) |
| 1531 |
\end{Verbatim} |
| 1532 |
|
| 1533 |
Finally, start \app{portmap} and \app{knfsd} (\app{nfsd} when using the user |
| 1534 |
space implementation): |
| 1535 |
\begin{Verbatim}[label=starting the daemons] |
| 1536 |
# /etc/init.d/portmap start |
| 1537 |
# /etc/init.d/knfsd start |
| 1538 |
\end{Verbatim} |
| 1539 |
|
| 1540 |
\chapter{Troubleshooting}\label{ch:troubleshooting} |
| 1541 |
|
| 1542 |
\section{Failsafe Mode} |
| 1543 |
|
| 1544 |
Failsafe mode is very useful if you misconfigured your embedded system, so that |
| 1545 |
you can not access it anymore. E.g. if you accidentially disabled secure shell |
| 1546 |
or misconfigured the firewall, so that you can not login any more. |
| 1547 |
|
| 1548 |
When in failsafe mode, the device won't interpret any networking setup files. |
| 1549 |
It stops even before the root filesystem gets mounted read--write, and fwcf is |
| 1550 |
set up. It will just set the LAN interface up and give it the IP address |
| 1551 |
\file{192.168.1.1} and netmask \file{255.255.255.0}. Then it will start a |
| 1552 |
\app{telnet} daemon, so you get straight access (without depending on the |
| 1553 |
installed SSH daemon). |
| 1554 |
|
| 1555 |
\subsection{How It Works} |
| 1556 |
|
| 1557 |
To get FreeWRT into failsafe mode you need physical access to the device and |
| 1558 |
the failsafe utility. The failsafe utility is built inside our ADK and is |
| 1559 |
available in the directory \file{bin/} after a successful build. |
| 1560 |
|
| 1561 |
If you just want to compile the tool and not a complete firmware image, use |
| 1562 |
following command: |
| 1563 |
|
| 1564 |
\begin{Verbatim}[label=building the failsafe utility for the host system] |
| 1565 |
$ make subdir=tools/failsafe install |
| 1566 |
\end{Verbatim} |
| 1567 |
|
| 1568 |
For some operating systems we provide ready to go binaries of failsafe. |
| 1569 |
Take a look at \url{http://www.freewrt.org/downloads/tools/failsafe} |
| 1570 |
|
| 1571 |
The tool just opens a network socket and waits for a special UDP packet |
| 1572 |
from the embedded device. FreeWRT sends the UDP packet via the first |
| 1573 |
recognized network interface (eth0). |
| 1574 |
|
| 1575 |
\subsection{Enabling Failsafe Mode} |
| 1576 |
|
| 1577 |
Connect your computer to the embedded system via direct or crossed network |
| 1578 |
cable. Use the failsafe port (in most cases one of the LAN ports), see the |
| 1579 |
device specific page for the exact network port. |
| 1580 |
|
| 1581 |
Configure your network interface to the IP address \file{192.168.1.2} with |
| 1582 |
network mask \file{255.255.255.0}. Now start the failsafe utility on your |
| 1583 |
computer. |
| 1584 |
|
| 1585 |
\begin{Verbatim} |
| 1586 |
$ ./failsafe |
| 1587 |
\end{Verbatim} |
| 1588 |
|
| 1589 |
After that power on your embedded system and wait for the following message in |
| 1590 |
your failsafe application running on your computer: |
| 1591 |
|
| 1592 |
\begin{Verbatim} |
| 1593 |
Press reset now to enter Failsafe! |
| 1594 |
\end{Verbatim} |
| 1595 |
|
| 1596 |
As soon as this message is displayed you should push the reset button of |
| 1597 |
your embedded system. You have 2 seconds time to push the button. If you |
| 1598 |
successfully enabled the failsafe mode, following message will be displayed: |
| 1599 |
|
| 1600 |
\begin{Verbatim} |
| 1601 |
Entering Failsafe! |
| 1602 |
\end{Verbatim} |
| 1603 |
|
| 1604 |
Now you should be able to login to your embedded system via a telnet |
| 1605 |
application. Just use: |
| 1606 |
|
| 1607 |
\begin{Verbatim} |
| 1608 |
$ telnet 192.168.1.1 |
| 1609 |
\end{Verbatim} |
| 1610 |
|
| 1611 |
\subsection{Repairing Your FreeWRT Configuration} |
| 1612 |
|
| 1613 |
If you want to repair your configuration, you first need to mount the root |
| 1614 |
filesystem read--writeable. This is best done via: |
| 1615 |
|
| 1616 |
\begin{Verbatim} |
| 1617 |
# mount_root |
| 1618 |
\end{Verbatim} |
| 1619 |
|
| 1620 |
After that you need to enable the FreeWRT configuration filesystem: |
| 1621 |
|
| 1622 |
\begin{Verbatim} |
| 1623 |
# fwcf setup |
| 1624 |
\end{Verbatim} |
| 1625 |
|
| 1626 |
Now you can change files in \file{/etc/} and repair your broken configuration. |
| 1627 |
Do not forget to commit your changes afterwards. |
| 1628 |
|
| 1629 |
\begin{Verbatim} |
| 1630 |
# fwcf commit |
| 1631 |
\end{Verbatim} |
| 1632 |
|
| 1633 |
If you want to start over with the default \file{/etc/} directory, just remove |
| 1634 |
the fwcf partition content with following command: |
| 1635 |
|
| 1636 |
\begin{Verbatim} |
| 1637 |
mtd erase fwcf |
| 1638 |
\end{Verbatim} |
| 1639 |
|
| 1640 |
You can either use \command{reboot -f} or the option \command{-r} for \app{mtd} |
| 1641 |
to reboot the system. |
| 1642 |
|
| 1643 |
%\section{Serial Console} |
| 1644 |
|
| 1645 |
%\section{JTAG} |
| 1646 |
|
| 1647 |
% Erstmal auskommentieren. Sind ja paar Seiten die erstmal keiner braucht |
| 1648 |
%\begin{appendix} |
| 1649 |
%\include{A-blaetter} |
| 1650 |
%\end{appendix} |
| 1651 |
|
| 1652 |
%\cleardoublepage |
| 1653 |
%\addcontentsline{toc}{chapter}{\glossaryname} |
| 1654 |
\end{document} |