]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/lib/mac/tkn154/DataP.nc
Indirect transmissions in nonbeacon-enabled PANs on coordinator side were not properl...
[tinyos-2.x.git] / tos / lib / mac / tkn154 / DataP.nc
index 1153b7a41a6a8fcb4225db3f9980188771678274..146c3b47fabffd4581670ff853956e64596b2e05 100644 (file)
@@ -42,7 +42,6 @@ module DataP
     interface MCPS_DATA; 
     interface MCPS_PURGE;
   } uses {
-    interface GetNow<bool> as IsSendingBeacons;
     interface FrameRx as CoordCapRx;
     interface FrameTx as DeviceCapTx;
     interface FrameTx as CoordCapTx;
@@ -88,9 +87,10 @@ implementation
     ieee154_status_t txStatus;
     ieee154_txframe_t *txFrame;
     uint8_t sfType=0;
-    uint8_t *mhr;
+    uint8_t *mhr, mhrLen = call Frame.getHeaderLength(frame);
 
-    if (payloadLen > call Packet.maxPayloadLength())
+    if (payloadLen > call Packet.maxPayloadLength() || 
+        mhrLen + payloadLen + 2 > IEEE154_aMaxPHYPacketSize) // extra 2 for MAC footer (CRC)
       txStatus = IEEE154_INVALID_PARAMETER;
     else if ((!srcAddrMode && !dstAddrMode) || 
         (srcAddrMode > ADDR_MODE_EXTENDED_ADDRESS || dstAddrMode > ADDR_MODE_EXTENDED_ADDRESS) ||
@@ -105,7 +105,7 @@ implementation
       txFrame->metadata = &((message_metadata_t*) frame->metadata)->ieee154;
       txFrame->payloadLen = payloadLen;
       mhr = txFrame->header->mhr;
-      txFrame->headerLen = call Frame.getHeaderLength(frame);
+      txFrame->headerLen = mhrLen;
       mhr[MHR_INDEX_FC1] &= ~(FC1_FRAMETYPE_MASK | FC1_FRAME_PENDING | FC1_ACK_REQUEST);
       mhr[MHR_INDEX_FC1] |= FC1_FRAMETYPE_DATA;
       if (txOptions & TX_OPTIONS_ACK)
@@ -144,7 +144,6 @@ implementation
 
       // indirect transmission?
       } else if ((txOptions & TX_OPTIONS_INDIRECT) && 
-          call IsSendingBeacons.getNow() && 
           (dstAddrMode >= ADDR_MODE_SHORT_ADDRESS)) {
         if (dstAddrMode == ADDR_MODE_SHORT_ADDRESS && dstAddr.shortAddress == 0xFFFF) {
           mhr[MHR_INDEX_FC1] &= ~FC1_ACK_REQUEST;
@@ -274,5 +273,4 @@ implementation
   default command ieee154_status_t DeviceCfpTx.transmit(ieee154_txframe_t *data) {return IEEE154_INVALID_GTS;}
   default command ieee154_status_t BroadcastTx.transmit(ieee154_txframe_t *data) {return IEEE154_INVALID_PARAMETER;}
   default command ieee154_status_t CoordCfpTx.transmit(ieee154_txframe_t *data) {return IEEE154_INVALID_GTS;}
-  default async command bool IsSendingBeacons.getNow() {return FALSE;}
 }