From a1107ed3dde91a7ce37beb050779e80aba9be019 Mon Sep 17 00:00:00 2001 From: strabest Date: Thu, 10 Jul 2008 20:15:56 +0000 Subject: [PATCH] Fixed bug in sendDone signaling --- tos/lib/net/tymo/ForwardingEngineM.nc | 33 +++++++++++++++++++-------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/tos/lib/net/tymo/ForwardingEngineM.nc b/tos/lib/net/tymo/ForwardingEngineM.nc index 5890ea41..15d1499c 100644 --- a/tos/lib/net/tymo/ForwardingEngineM.nc +++ b/tos/lib/net/tymo/ForwardingEngineM.nc @@ -43,7 +43,7 @@ implementation { message_t * waiting; uint8_t typebuf; uint8_t lenWaiting; - uint8_t amWaiting; + uint8_t amWaiting = 0; am_addr_t bufAddr; am_addr_t * addrWaiting; bool lockAvail, lockWaiting; @@ -60,6 +60,7 @@ implementation { case FW_SEND: call PPacket.setPayloadLength(msg, len); acks = DYMO_LINK_FEEDBACK && (call Acks.requestAck(msg) == SUCCESS); + typebuf = am; return call SubSend.send(call AMPacket.destination(msg), msg, call SubPacket.payloadLength(msg)); case FW_WAIT: @@ -90,23 +91,29 @@ implementation { switch(call RouteSelect.selectRoute(msg, NULL, &typebuf)){ case FW_SEND: atomic { - if(lockAvail) + if (lockAvail) { + dbg("fwe", "FE: Discarding a received message because no avail buffer.\n"); return msg; + } lockAvail = TRUE; } if ( signal Intercept.forward[typebuf](msg, call PPacket.getPayload(msg, call PPacket.payloadLength(msg)), call PPacket.payloadLength(msg)) ) { + acks = DYMO_LINK_FEEDBACK && (call Acks.requestAck(msg) == SUCCESS); call SubSend.send(call AMPacket.destination(msg), msg, len); } return avail; case FW_RECEIVE: + dbg("fwe", "FE: Received a message, signaling to upper layer.\n"); payload = call PPacket.getPayload(msg, call PPacket.payloadLength(msg)); return signal Receive.receive[typebuf](msg, payload, call PPacket.payloadLength(msg)); case FW_WAIT: atomic { - if(lockAvail || lockWaiting) + if(lockAvail || lockWaiting) { + dbg("fwe", "FE: Discarding a received message because no avail or wait buffer.\n"); return msg; + } lockAvail = lockWaiting = TRUE; } waiting = msg; @@ -117,13 +124,14 @@ implementation { return avail; default: + dbg("fwe", "FE: Discarding a received message because I don't know what to do.\n"); return msg; } } event void SubSend.sendDone(message_t * msg, error_t e){ - dbg("fwe", "FE: Sending done.\n"); - if( (e == SUCCESS) && acks ){ + dbg("fwe", "FE: Sending done...\n"); + if ((e == SUCCESS) && acks) { if( !(call Acks.wasAcked(msg)) ){ e = FAIL; dbg("fwe", "FE: The message was not acked => FAIL.\n"); @@ -131,17 +139,24 @@ implementation { signal LinkMonitor.brokenLink(call AMPacket.destination(msg)); } } else if (e != SUCCESS) { - dbg("fwe", "FE: But failed!\n"); + dbg("fwe", "FE: ...but failed!\n"); signal MHControl.sendFailed(msg, 1); } - - if(lockAvail){ + + if (lockAvail) { avail = msg; atomic { lockAvail = FALSE; } + dbg("fwe", "FE: No need to signal sendDone.\n"); } else { - signal AMSend.sendDone[amWaiting](msg, e); + dbg("fwe", "FE: Signaling sendDone.\n"); + if (amWaiting) { + signal AMSend.sendDone[amWaiting](msg, e); + amWaiting = 0; + } else { + signal AMSend.sendDone[typebuf](msg, e); + } atomic { lockWaiting = FALSE; } -- 2.39.2