?? devs-eth-synth-ecosynth.html
字號:
<!-- Copyright (C) 2003 Red Hat, Inc. -->
<!-- This material may be distributed only subject to the terms -->
<!-- and conditions set forth in the Open Publication License, v1.0 -->
<!-- or later (the latest version is presently available at -->
<!-- http://www.opencontent.org/openpub/). -->
<!-- Distribution of the work or derivative of the work in any -->
<!-- standard (paper) book form is prohibited unless prior -->
<!-- permission is obtained from the copyright holder. -->
<HTML
><HEAD
><TITLE
>Synthetic Target Ethernet Driver</TITLE
><meta name="MSSmartTagsPreventParsing" content="TRUE">
<META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
"><LINK
REL="HOME"
TITLE="eCos Reference Manual"
HREF="ecos-ref.html"><LINK
REL="UP"
TITLE="Synthetic Target Ethernet Driver"
HREF="devs-eth-synth-ecosynth-ref.html"><LINK
REL="PREVIOUS"
TITLE="Synthetic Target Ethernet Driver"
HREF="devs-eth-synth-ecosynth-ref.html"><LINK
REL="NEXT"
TITLE="Synthetic Target Watchdog Device"
HREF="devs-watchdog-synth-ref.html"></HEAD
><BODY
CLASS="REFENTRY"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>eCos Reference Manual</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="devs-eth-synth-ecosynth-ref.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="devs-watchdog-synth-ref.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><H1
><A
NAME="DEVS-ETH-SYNTH-ECOSYNTH">Synthetic Target Ethernet Driver</H1
><DIV
CLASS="REFNAMEDIV"
><A
NAME="AEN18905"
></A
><H2
>Name</H2
>Synthetic Target Ethernet Support -- Allow synthetic target applications to perform ethernet I/O</DIV
><DIV
CLASS="REFSECT1"
><A
NAME="AEN18908"
></A
><H2
>Overview</H2
><P
>The synthetic target ethernet package can provide up to four network
devices, <TT
CLASS="VARNAME"
>eth0</TT
> to <TT
CLASS="VARNAME"
>eth3</TT
>. These can
be used directly by the eCos application or, more commonly, by a
TCP/IP stack that is linked with the eCos application. Each eCos
device can be mapped on to a real Linux network device. For example,
if the Linux PC has two ethernet cards and <TT
CLASS="VARNAME"
>eth1</TT
> is
not currently being used by Linux itself, then one of the eCos devices
can be mapped on to this Linux device. Alternatively, it is possible
to map some or all of the eCos devices on to the ethertap support
provided by the Linux kernel.
</P
><P
>The ethernet package depends on the I/O auxiliary provided by the
synthetic target architectural HAL package. During initialization the
eCos application will attempt to instantiate the desired devices, by
sending a request to the auxiliary. This will load a Tcl script
<TT
CLASS="FILENAME"
>ethernet.tcl</TT
> that is responsible for handling the
instantiation request and subsequent I/O operations, for example
transmitting an ethernet packet. However, some of the low-level I/O
operations cannot conveniently be done by a Tcl script so
<TT
CLASS="FILENAME"
>ethernet.tcl</TT
> will actually run a separate program
<B
CLASS="COMMAND"
>rawether</B
> to interact with the Linux network device.
</P
><DIV
CLASS="INFORMALFIGURE"
><A
NAME="AEN18918"><P
></P
><DIV
CLASS="MEDIAOBJECT"
><P
><IMG
SRC="overview.gif"
ALIGN="CENTER"></P
></DIV
><P
></P
></DIV
><P
>On the target-side there are configuration options to control which
network devices should be present. For many applications a single
device will be sufficient, but if the final eCos application is
something like a network bridge then the package can support multiple
devices. On the host-side each eCos network device needs to be mapped
on to a Linux one, either a real ethernet device or an ethertap
device. This is handled by an entry in the target definition file:
</P
><TABLE
BORDER="5"
BGCOLOR="#E0E0F0"
WIDTH="70%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>synth_device ethernet {
eth0 real eth1
eth1 ethertap tap3 00:01:02:03:FE:05
…
}</PRE
></TD
></TR
></TABLE
><P
>The ethernet package also comes with support for packet logging,
and provides various facilities for use by user Tcl scripts.
</P
></DIV
><DIV
CLASS="REFSECT1"
><A
NAME="DEVS-ETH-ECOSYNTH-INSTALL"
></A
><H2
>Installation</H2
><P
>Before a synthetic target eCos application can access ethernet devices
it is necessary to build and install host-side support. The relevant
code resides in the <TT
CLASS="FILENAME"
>host</TT
>
subdirectory of the synthetic target ethernet package, and building it
involves the standard <B
CLASS="COMMAND"
>configure</B
>,
<B
CLASS="COMMAND"
>make</B
> and <B
CLASS="COMMAND"
>make install</B
> steps.
The build involves a new executable <B
CLASS="COMMAND"
>rawether</B
> which
must be able to access a raw Linux network device. This is achieved by
installing it suid root, so the <B
CLASS="COMMAND"
>make install</B
> step
has to be run with superuser privileges.
</P
><DIV
CLASS="CAUTION"
><P
></P
><TABLE
CLASS="CAUTION"
BORDER="1"
WIDTH="100%"
><TR
><TD
ALIGN="CENTER"
><B
>Caution</B
></TD
></TR
><TR
><TD
ALIGN="LEFT"
><P
>Installing <B
CLASS="COMMAND"
>rawether</B
> suid root introduces a
potential security problem. Although normally
<B
CLASS="COMMAND"
>rawether</B
> is executed only by the I/O auxiliary,
theoretically it can be run by any program. Effectively it gives any
user the ability to monitor all ethernet traffic and to inject
arbitrary packets into the network. Also, as with any suid root
programs there may be as yet undiscovered exploits. Users and system
administrators should consider the risks before running <B
CLASS="COMMAND"
>make
install</B
>.
</P
></TD
></TR
></TABLE
></DIV
><P
>There are two main ways of building the host-side software. It is
possible to build both the generic host-side software and all
package-specific host-side software, including the ethernet support,
in a single build tree. This involves using the
<B
CLASS="COMMAND"
>configure</B
> script at the toplevel of the eCos
repository. For more information on this, see the
<TT
CLASS="FILENAME"
>README.host</TT
> file at the top of the repository.
Note that if you have an existing build tree which does not include
the synthetic target ethernet support then it will be necessary to
rerun the toplevel configure script: the search for appropriate
packages happens at configure time.
</P
><P
>The alternative is to build just the host-side for this package.
This requires a separate build directory, building directly in the
source tree is disallowed. The <B
CLASS="COMMAND"
>configure</B
> options
are much the same as for a build from the toplevel, and the
<TT
CLASS="FILENAME"
>README.host</TT
> file can be consulted for more
details. It is essential that the ethernet support be configured with
the same <TT
CLASS="OPTION"
>--prefix</TT
> option as other eCos host-side
software, especially the I/O auxiliary provided by the architectural
synthetic target HAL package, otherwise the I/O auxiliary will be
unable to locate the ethernet support.
</P
></DIV
><DIV
CLASS="REFSECT1"
><A
NAME="DEVS-ETH-ECOSYNTH-OPTIONS"
></A
><H2
>Target-side Configuration Options</H2
><P
>The target-side code can be configured to support up to four ethernet
devices, <TT
CLASS="VARNAME"
>eth0</TT
> to <TT
CLASS="VARNAME"
>eth3</TT
>. By
default <TT
CLASS="VARNAME"
>eth0</TT
> is enabled if the configuration
includes a TCP/IP stack, otherwise it is disabled. The other three
devices are always disabled by default. If any of the devices are
enabled then there will also be the usual configuration options
related to building this package. Other options related to network
devices, for example whether or not to use DHCP, are provided by
the generic network device package.
</P
></DIV
><DIV
CLASS="REFSECT1"
><A
NAME="DEVS-ETH-ECOSYNTH-REAL"
></A
><H2
>Real Ethernet</H2
><P
>One obvious way of providing a synthetic target eCos application with
ethernet I/O is to use a real ethernet device in the PC: transmitted
packets go out on a real network, and packets on the network addressed
to the right MAC address are passed on to eCos. This way synthetic
target networking behaves just like networking on a real target with
ethernet hardware. For example, if there is a DHCP server anywhere on
the network then eCos will be able to contact it during networking
startup and get hold of IP address information.
</P
><P
>Configuring the ethernet support to use a real ethernet device
requires a simple entry in the target definition file:
</P
><TABLE
BORDER="5"
BGCOLOR="#E0E0F0"
WIDTH="70%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>synth_device ethernet {
<eCos device> real <linux device>
…
}</PRE
></TD
></TR
></TABLE
><P
>For example, to map the eCos network device <TT
CLASS="VARNAME"
>eth0</TT
> to
the Linux device <TT
CLASS="VARNAME"
>eth1</TT
>:
</P
><TABLE
BORDER="5"
BGCOLOR="#E0E0F0"
WIDTH="70%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>synth_device ethernet {
eth0 real eth1
…
}</PRE
></TD
></TR
></TABLE
><P
>It is not possible for an ethernet device to be shared by both the
eCos TCP/IP stack and the Linux one: there would be no simple way to
work out which stack incoming packets are intended for. In theory
it might be possible to do some demultiplexing using distinct IP
addresses, but it would be impossible to support some functionality
such as DHCP. Therefore the <B
CLASS="COMMAND"
>rawether</B
> program will
refuse to access any ethernet device already in use. On a typical
Linux system <TT
CLASS="VARNAME"
>eth0</TT
> will be used for Linux
networking, and the PC will have to be equipped with additional
ethernet devices for use by eCos.
</P
><P
>The <B
CLASS="COMMAND"
>rawether</B
> program will access the hardware via
the appropriate Linux device driver, so it is important that the
system is set up such that the relevant module will be automatically
loaded or is already loaded. The details of this will depend on the
installed distribution and version, but typically it will involve an
entry in <TT
CLASS="FILENAME"
>/etc/modules.conf</TT
>.
</P
></DIV
><DIV
CLASS="REFSECT1"
><A
NAME="DEVS-ETH-ECOSYNTH-ETHERTAP"
></A
><H2
>Ethertap</H2
><P
>The Linux kernel's ethertap facility provides a virtual network
interface. A Linux application, for example the
<B
CLASS="COMMAND"
>rawether</B
> program, can open a special character
device <TT
CLASS="FILENAME"
>/dev/net/tun</TT
>, perform various
<TT
CLASS="FUNCTION"
>ioctl</TT
> calls, and then <TT
CLASS="FILENAME"
>write</TT
>
and <TT
CLASS="FILENAME"
>read</TT
> ethernet packets. When the device is
opened the Linux kernel automatically creates a new network interface,
for example <TT
CLASS="VARNAME"
>tap0</TT
>. The Linux TCP/IP stack can be
made to use this network interface like any other interface, receiving
and transmitting ethernet packets. The net effect is a virtual network
connecting just the Linux and eCos TCP/IP stacks, with no other nodes
attached. By default all traffic remains inside this virtual network
and is never forwarded to a real network.
</P
><P
>Support for the ethertap facility may or may not be provided
automatically, depending on your Linux distribution and version. If
your system does not have a device <TT
CLASS="FILENAME"
>/dev/net/tun</TT
>
or a module <TT
CLASS="FILENAME"
>tun.o</TT
> then the appropriate kernel
documentation should be consulted, for example
<TT
CLASS="FILENAME"
>/usr/src/linux-2.4/Documentation/networking/tuntap.txt</TT
>.
If you are using an old Linux kernel then the ethertap functionality
may be missing completely. When the <B
CLASS="COMMAND"
>rawether</B
>
program is configured and built, the <B
CLASS="COMMAND"
>configure</B
>
script will check for a file <TT
CLASS="FILENAME"
>/usr/include/linux/if_tun.h</TT
>. If that
file is missing then <B
CLASS="COMMAND"
>rawether</B
> will be built without
ethertap functionality, and only real ethernet interfaces will be
supported.
</P
><P
>The target definition file is used to map eCos network devices on to
ethertap devices. The simplest usage is:
</P
><TABLE
BORDER="5"
BGCOLOR="#E0E0F0"
WIDTH="70%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>synth_device ethernet {
eth0 ethertap
…
}</PRE
></TD
></TR
></TABLE
><P
>The Linux kernel will automatically allocate the next available tap
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -