[net2-wg] Collection queue policy

Philip Levis pal at cs.stanford.edu
Wed Apr 26 09:59:49 PDT 2006


On Apr 26, 2006, at 7:55 AM, Rodrigo Fonseca wrote:

> Hi,
>
> checked in a fairly complete skeleton of TreeRoutingEngineImplP.nc,
> missing is the function that chooses the current parent given the
> state of the neighbors and the simpler sendBeaconTask.
>
> It interfaces with Phil's ForwardingEngine, and with the  
> LinkEstimator.
> Specifically, from the link estimator it uses the Packet and
> LinkSrcPacket interfaces.
> It maintains its own network level table with the route info about the
> neighbors: their parent, hopcount, cost (metric), and this table is
> synchronized with the LinkEstimator neighbor table. For this, it only
> needs an event evicted, that informs when a neighbor should be removed
> from the table.

Great. Once everyone has progressed far enough to be convinced that  
the current component signatures work and don't require revision,  
then I think we can start testing our individual parts, then stick  
them together.

One interesting thing that came up in Kyle and my discussions was the  
relationship between sending clients and the forwarding queue with  
regards to scheduling. CollectionC creates both ForwardingEngineP's  
forwarding pool as well as its send queue. The send queue has to have  
one slot for every packet in the forwarding pool: the question is how  
many slots to allocate for send clients.

The two options we considered were "1 slot for all sending clients"  
and "1 slot for each sending client." There are some implementation  
implications for these decisions. The former is a little simpler in  
the ForwardingEngineP, as all of the sending clients establish a  
queue above the engine and share the one send queue slot. The latter  
is a little more within ForwardingEngineP, but it doesn't require an  
additional queue above, so the composition is simpler.

The more important difference, however, is how the decision affects  
bandwidth allocation. If all send clients share a single slot, then  
if there are C clients and F entries in the forwarding pool, each  
client's minimum share of the bandwidth is 1 / (C(F+1)). The 1/(F+1)  
is because there's a single slot in the send queue for all clients  
(which is therefore length F+1), and the 1/C is because there are C  
clients. Note that this is single-hop, not multi-hop, bandwidth.

If each send client has its own slot, then a client minimum share is  
1 / (C + F), as the queue is of size C+F. This also saves a single  
slot worth of RAM, as we're not putting a queue on top of another queue.

Kyle is currently running with the latter approach.

I've added two helper components to the collection directory, Queue  
and Pool. My guess is that these should move into system/ at some  
point. When I get a chance, I can trim a byte from the QueueC  
implementation (no need to keep head, tail, and size, head + size is  
sufficient). I didn't use the Moteiv pool because it's not race-free  
on all platforms; if reading/writing a pointer is a non-atomic  
operation, you can corrupt the pool. This isn't an issue on MSP430- 
based platforms, but is on atm128-based ones.

Phil



More information about the net2-wg mailing list