Data Access Example

This example describes typical processing of the data in an RMBufChain.

Downwards flow

Figure 1. Example : flow going downwards

The following function is a simplified example of how a component in the middle of the stack could process data sent to the driver. As shown in the above diagram, the upper layer provides the data in the RMBufChain parameter.


void Send (RMBufChain &aChain) 
{
   TBuf8<KHeaderLength> aHeader;
   
   // [...] fill the header

   // request space in front of the data 
   aChain.Prepend(KHeaderLength);

   // add the protocol header
   aChain.CopyIn(aHeader);

   // send the updated chain to the next layer
   downwardComponent->Send(aChain);
}
   

Note that depending on the available space remaining in front of the data in the MBuf, the RMBufChain::Prepend() method may request the pond to add a new MBuf to the front of the chain. For more information, see Buffer layout.

Upwards flow

Figure 2. Example : flow going upwards

The following function is a simplified example of how a component in the middle of the stack could process data received by the driver. As shown in the above diagram, the underlying layer provides the data in the RMBufChain parameter.


void Process (RMBufChain &aChain)
{
   TBuf8<KHeaderLength> aHeader;
   
   // get a copy of the header
   aChain.CopyOut(KHeaderLength, &aHeader);
   
   // discard the header in the chain
   aChain.TrimStart(KHeaderLength);

   // [...] process the header
   
   // send the updated chain to the next layer
   appropriateUpwardComponent->Process(aChain);
}

Note that the header might not be stored in a contiguous memory area: it can be splitted accross several chained MBufs. For a better performance, you should define a buffer size slightly bigger than your MTU: for more information, see Pond Configuration : Recommendations.