6.7 The uIP TCP/IP stack 16
bytes in every packet being sent and received it is important that the function that calculates the checksum
is efficient. Most often, this means that the checksum calculation must be fine-tuned for the particular
architecture on which the uIP stack runs.
While uIP includes a generic checksum function, it also leaves it open for an architecture specific imple-
mentation of the two functions uip_ipchksum() and uip_tcpchksum(). The checksum calculations in those
functions can be written in highly optimized assembler rather than generic C code.
6.7.6.2 32-bit Arithmetic The TCP protocol uses 32-bit sequence numbers, and a TCP implementation
will have to do a number of 32-bit additions as part of the normal protocol processing. Since 32-bit
arithmetic is not natively available on many of the platforms for which uIP is intended, uIP leaves the 32-
bit additions to be implemented by the architecture specific module and does not make use of any 32-bit
arithmetic in the main code base.
While uIP implements a generic 32-bit addition, there is support for having an architecture specific imple-
mentation of the uip_add32() function.
6.7.7 Memory Management
In the architectures for which uIP is intended, RAM is the most scarce resource. With only a few kilobytes
of RAM available for the TCP/IP stack to use, mechanisms used in traditional TCP/IP cannot be directly
applied.
The uIP stack does not use explicit dynamic memory allocation. Instead, it uses a single global buffer
for holding packets and has a fixed table for holding connection state. The global packet buffer is large
enough to contain one packet of maximum size. When a packet arrives from the network, the device driver
places it in the global buffer and calls the TCP/IP stack. If the packet contains data, the TCP/IP stack
will notify the corresponding application. Because the data in the buffer will be overwritten by the next
incoming packet, the application will either have to act immediately on the data or copy the data into a
secondary buffer for later processing. The packet buffer will not be overwritten by new packets before the
application has processed the data. Packets that arrive when the application is processing the data must be
queued, either by the network device or by the device driver. Most single-chip Ethernet controllers have
on-chip buffers that are large enough to contain at least 4 maximum sized Ethernet frames. Devices that
are handled by the processor, such as RS-232 ports, can copy incoming bytes to a separate buffer during
application processing. If the buffers are full, the incoming packet is dropped. This will cause performance
degradation, but only when multiple connections are running in parallel. This is because uIP advertises
a very small receiver window, which means that only a single TCP segment will be in the network per
connection.
In uIP, the same global packet buffer that is used for incoming packets is also used for the TCP/IP headers
of outgoing data. If the application sends dynamic data, it may use the parts of the global packet buffer that
are not used for headers as a temporary storage buffer. To send the data, the application passes a pointer to
the data as well as the length of the data to the stack. The TCP/IP headers are written into the global buffer
and once the headers have been produced, the device driver sends the headers and the application data out
on the network. The data is not queued for retransmissions. Instead, the application will have to reproduce
the data if a retransmission is necessary.
The total amount of memory usage for uIP depends heavily on the applications of the particular device in
which the implementations are to be run. The memory configuration determines both the amount of traffic
the system should be able to handle and the maximum amount of simultaneous connections. A device that
will be sending large e-mails while at the same time running a web server with highly dynamic web pages
and multiple simultaneous clients, will require more RAM than a simple Telnet server. It is possible to run
the uIP implementation with as little as 200 bytes of RAM, but such a configuration will provide extremely
low throughput and will only allow a small number of simultaneous connections.
Generated on Mon Jul 2 14:14:41 2007 for Contiki 2.x by Doxygen