6 BUFFER AND MEMORY MANAGEMENT
of lw IP that precludes it from later b eing implemented in an operating system kernel.
5 The operating system emulation layer
In order to make lwIP portable, operating system specific function calls and data structures are not
used directly in the code. Instead, when such functions are needed the operating system emulation
layer is used. The operating system emulation layer provides a uniform interface to operating
system services such as timers, process synchronization, and message passing mechanisms. In
principle, when porting lw IP to other operating systems only an implementation of the operating
system emulation layer for that particular operating system is needed.
The operating system emulation layer provides a timer functionality that is used by TCP. The
timers provided by the operating system emulation layer are one-shot timers with a granularity of
at least 200 ms that calls a registered function when the time-out occurs.
The only process synchronization mechanism provided is semaphores. Even if semaphores are
not avaliable in the underlying operating system they can be emulated by other synchronization
primitives such as conditional variables or locks.
The message passing is done through a simple mechanism which uses an abstraction called
mailboxes. A mailbox has two operations: post and fetch. The post operation will not block the
process; rather, messages posted to a mailbox are queued by the operating system emulation layer
until another process fetches them. Even if the underlying operating system does not have native
support for the mailbox mechanism, they are easily implemented using semaphores.
6 Buffer and memory management
The memory and buffer management system in a communication system must be prepared to
accommodate buffers of very varying sizes, ranging from buffers containing full-sized TCP segments
with several hundred bytes worth of data to short ICMP echo replies consisting of only a few bytes.
Also, in order to avoid copying it should be possible to let the data content of the buffers reside in
memory that is not managed by the networking subsystem, such as application memory or ROM.
6.1 Packet buffers — pbufs
A pbuf is lwIP’s internal representation of a packet, and is designed for the special needs of
the minimal stack. Pbufs are similar to the mbufs used in the BSD implementations. The pbuf
structure has support both for allocating dynamic memory to hold packet contents, and for letting
packet data reside in static memory. Pbufs can be linked together in a list, called a pbuf chain so
that a packet may span over several pbufs.
Pbufs are of three types, PBUF
RAM, PBUF ROM, and PBUF POOL. The pbuf shown in
Figure 1 represents the PBUF
RAM type, and has the packet data stored in memory managed by
the pbuf subsystem. The pbuf in Figure 2 is an example of a chained pbuf, where the first pbuf
in the chain is of the PBUF
RAM typ e, and the second is of the PBUF ROM type, which means
that it has the data located in memory not managed by the pbuf system. The third type of pbuf,
PBUF
POOL, is shown in Figure 3 and consists of fixed size pbufs allocated from a pool of fixed
size pbufs. A pbuf chain may consist of multiple types of pbufs.
The three types have different uses. Pbufs of type PBUF
POOL are mainly used by network
device drivers since the operation of allocating a single pbuf is fast and is therefore suitable for
use in an interrupt handler. PBUF
ROM pbufs are used when an application sends data that is
located in memory managed by the application. This data may not be modified after the pbuf
has been handed over to the TCP/IP stack and therefore this pbuf type main use is when the
data is located in ROM (hence the name PBUF
ROM). Headers that are prepended to the data
in a PBUF
ROM pbuf are stored in a PBUF RAM pbuf that is chained to the front of of the
PBUF
ROM pbuf, as in Figure 2.
3