	       A 6lowpan implementation for TinyOS 2.x

This is a 6lowpan implementation for TinyOS 2.x. Mesh Addressing and
Broadcast headers are parsed, but no mesh-networking/multi-hopping is
implemented. 6lowpan fragmentation and fragment reassembly is fully
supported. The 6lowpan-specified HC1 compression of the IPv6 header
and the HC_UDP compression of the UDP header are supported as well as
handling of the uncompressed headers. The implementation can respond
to ICMP echo requests and handles communication over the UDP
protocol. It has been tested on the TelosB and MicaZ hardware
platforms. In addition a 6lowpan-translating daemon has been
implemented to allow a linux PC to use a mote as an 802.15.4
interface.

Shortcomings and missing features:
 * 6lowpan payload is sent as Active Message payload. This means that
   the 802.15.4 payload is prefixed with the 1-byte AM Type field.
 * non-zero Traffic Class and Flow Label are not supported by the
   current HC1 implementation
 * UDP port numbers compression is not supported and port numbers are
   always sent in full by the current HC_UDP compression
 * Neighbor Discovery has not been implemented and link local
   broadcasts are used instead.
 * Not all fragments of a datagram seem to be always received by the
   mote. A workaround is to add a usleep(10000) before sending subsequent
   fragments in the serial_tun daemon on the PC.
 * The mspgcc compiler generates broken code using 16-bit values not
   aligned at 16-bit boundaries. See
   http://www.nabble.com/msp430-gcc-generating-unaligned-access.-t2261862.html
   and page 25 in
   http://www.eecs.harvard.edu/~konrad/projects/motetrack/
   mspgcc-manual-20031127.pdf
   for details. This seems to only happen with packed structs, where
   some elements cannot be aligned. For example, a struct with an
   8-bit, 16-bit, 8-bit and 16-bit value in the given order. As the
   struct is packed, one of the 16-bit values can be aligned at a
   16-bit boundary.
   The current workaround is to force 8-bit operations for cases where
   this can happen. This is done by the set_16t(), get_16t()
   functions. In cases where unaligned accesses could happen, these
   functions have to be used.

More details can be found in
	http://www.inf.ethz.ch/personal/mharvan/docs/msc-thesis.pdf
or by reading the source code.


USAGE - MOTE
The 6lowpan/IPv6 stack is implemented in the IPP module. Applications
should use the IPC component which takes care of wiring the necessary
components. The stack offers the UDPClient interface to application
wishing to exchange UDP datagrams. Replying to ICMP echo requests is
done by the 6lowpan stack.

The stack support two IPv6 addresses:
 * a global address
 * a link-local address

The link-local address is assigned using an interface identifier
computed from the Active Message address of the mote. This is almost
like the stateless autoconfiguration, but Duplicate Address Detection
or Router Solicitations are not implemented.

The global address can be set manually with
IPC.setAddress(). Alternatively, only the prefix of the global address
can be set with IPC.setAddressAutoconf() and the suffix will be
generated from the Active Message address of the mote.

A sample application using the 6lowpan stack is in apps/6lowpancli.

USAGE - PC
To interact with a 6lowpan mote from a PC, a mote flashed with the
BaseStation application (apps/BaseStation) has to be attached to the
PC. Note that the application has to be built with
	CFLAGS += -D'TOSH_DATA_LENGTH=102'.

Furthermore, the serial_tun daemon (support/sdk/c/6lowpan/serial_tun/)
has to run on the PC.

Afterwards, ping6 and nc6 should work for talking to the motes.

Debugging output with printf over USB can be enabled with
	CFLAGS="-D'ENABLE_PRINTF_DEBUG=1'

To minimize memory usage, i.e. disable everything (at the moment only
the UDP cli) to determine minimum RAM/ROM requirements, use
	CFLAGS="-D'MINIMIZE_MEMORY=1'