interface MCPS_DATA;
interface MCPS_PURGE;
} uses {
- interface GetNow<bool> as IsSendingBeacons;
interface FrameRx as CoordCapRx;
interface FrameTx as DeviceCapTx;
interface FrameTx as CoordCapTx;
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) ||
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)
// 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;
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;}
}