Index: /home/roglar/workspace/tinyos-main-read-only/tos/lib/rfxlink/layers/PacketLinkLayerP.nc
===================================================================
--- /home/roglar/workspace/tinyos-main-read-only/tos/lib/rfxlink/layers/PacketLinkLayerP.nc	(revision 5438)
+++ /home/roglar/workspace/tinyos-main-read-only/tos/lib/rfxlink/layers/PacketLinkLayerP.nc	(working copy)
@@ -62,10 +62,11 @@
 		STATE_READY = 0,
 		STATE_SENDING = 1,
 		STATE_SENDDONE = 2,
-		STATE_SIGNAL = 4,	// add error code
+		STATE_SIGNAL = 4,
 	};
 
 	uint8_t state = STATE_READY;
+	error_t sub_error = SUCCESS;
 	message_t *currentMsg;
 	uint16_t totalRetries;
 
@@ -84,8 +85,11 @@
 
 		if( state == STATE_SENDDONE )
 		{
-			if( call PacketAcknowledgements.wasAcked(currentMsg) )
-				state = STATE_SIGNAL + SUCCESS;
+			if( retries && call PacketAcknowledgements.wasAcked(currentMsg) )
+			{
+				state = STATE_SIGNAL;
+				sub_error = SUCCESS;
+			}
 			else if( ++totalRetries < retries )
 			{
 				uint16_t delay;
@@ -99,8 +103,17 @@
 					return;
 				}
 			}
+			else if (retries)
+			{
+				// no acknowledges - fail even if every send in itself was successfull
+				state = STATE_SIGNAL;
+				sub_error = FAIL; 
+			}
 			else
-				state = STATE_SIGNAL + FAIL;
+			{
+				state = STATE_SIGNAL;
+				// report the actual sub_error
+			}
 		}
 
 		if( state == STATE_SENDING )
@@ -113,24 +126,26 @@
 			return;
 		}
 
-		if( state >= STATE_SIGNAL )
+		if( state == STATE_SIGNAL )
 		{
-			error_t error = state - STATE_SIGNAL;
-
 			// do not update the retries count for non packet link messages
 			if( retries > 0 )
 				call PacketLink.setRetries(currentMsg, totalRetries);
 
 			state = STATE_READY;
-			signal Send.sendDone(currentMsg, error);
+			signal Send.sendDone(currentMsg, sub_error);
 		}
 	}
 
 	event void SubSend.sendDone(message_t* msg, error_t error)
 	{
-		RADIO_ASSERT( state == STATE_SENDDONE || state == STATE_SIGNAL + ECANCEL );
+		RADIO_ASSERT( state == STATE_SENDDONE || state == STATE_SIGNAL && sub_error == ECANCEL );
 		RADIO_ASSERT( msg == currentMsg );
 
+		// BUG FIXED: the error return was lost, later code would assume failure unless acknowledged...
+		// With this change clients will actually see if message was sent, failed in some way or canceled
+		sub_error = error;
+
 		post send();
 	}
 
@@ -170,7 +185,8 @@
 			post send();
 
 		call DelayTimer.stop();
-		state = STATE_SIGNAL + ECANCEL;
+		state = STATE_SIGNAL;
+		sub_error = ECANCEL; // Note: might get overwritten by actual cause
 
 		return SUCCESS;
 	}
