Stack Organization
Overview
Protocol layers are wired together to form a stack. Click on the image to the right to see the stack organization diagram of the OpenWSN protocol stack. Send
functions are used to push packets down the stack; Receive
functions to pull them up. The bytes of a packet live in the OpenQueue
component. A packet is a variable of type OpenQueueEntry_t
and is defined in openwsn.h; components pass a pointer to an OpenQueueEntry_t
variables in the Send
and Receive
functions.
OpenQueueEntry_t and metadata
An OpenQueueEntry_t
consists of the actual bytes in the packet, plus a number of metadata fields. Metadata is used for an upper (resp. lower) layer to set parameters a lower (resp. upper) layer will need, when sending a packet down (resp. up) the stack. One example is that the MAC layer sets l1_channel
to instruct the driver about which channel it needs to transmit the packet on. Another example is that RPL layer specifies l2_nextORpreviousHop
, indicating to the MAC layer to which neighbor this packet needs to go.
...
creator
indicates the component which created this packet, i.e. which requested an unusedOpenQueueEntry_t
to theOpenQueue
component. When sending a packet down the stack, the convention is that only the creator of a packet can free that packet, i.e. instruct theOpenQueue
component it doesn't need it anymore. Typically,OpenQueueEntry_t
variables will be created by all application-layer component when sending a packet, or by the drivers when receiving.owner
indicates the components which currently holds the packet. The convention is that a component can only change the content of anOpenQueueEntry_t
if it is currently the owner.- The
packet
part of theOpenQueueEntry_t
holds the actual bytes of the packet. Because OpenWSN does not allow for dynamic memory allocation,packet
is the maximal allowed size.payload
is a pointer to the first used by inpacket
;length
indicates how many bytes are used.
Adding/removing protocol headers
When a component requests an unused OpenQueueEntry_t
from the OpenQueue
component, payload
points to the end packet
and length
is zero. If a components needs to add n
bytes of data to the packet pkt
, it calls:
...
No Format |
---|
packetfunctions_reserveHeaderSize(msg,sizeof(tcp_ht)); |
Story of a packet
This section tells the story about what each layer does in the OpenWSN implementation, including which layers read and write metadata. There are two parts: one which details what happens when a packet is generated at the application layer, and travels down the stack until the drivers; one the other way.
...
| App | L4 | RPL | IPHC | RES | MAC | drivers |
creator | w |
|
|
|
|
|
|
owner | w | w | w | w | w | ww |
|
l4_protocol | w/r |
|
|
|
|
|
|
l4_source_port | w | r |
|
|
|
|
|
l4_destination_port | w | r |
|
|
|
|
|
l4_payload |
| w/r |
|
|
|
|
|
l4_length |
| w/r |
|
|
|
|
|
l3_destinationORsource | w |
| r | r |
|
|
|
l2_nextORpreviousHop |
|
| w |
|
| r |
|
l2_frameType |
|
|
|
| w | r |
|
l2_retriesLeft |
|
|
|
|
| w/r |
|
l1_txPower |
|
|
|
|
| w | r |
l1_channel |
|
|
|
|
| w | r |
l1_rssi |
|
|
|
|
|
|
|
l1_lqi |
|
|
|
|
|
|
|
l1_crc |
|
|
|
|
|
|
|
l1_rxTimestamp |
|
|
|
|
|
|
|
...