isShortAddr = (shortAddress != 0xFFFE);
m_beaconFrame.header->mhr[MHR_INDEX_FC1] = FC1_FRAMETYPE_BEACON;
m_beaconFrame.header->mhr[MHR_INDEX_FC2] = isShortAddr ? FC2_SRC_MODE_SHORT : FC2_SRC_MODE_EXTENDED;
- m_beaconFrame.header->mhr[MHR_INDEX_SEQNO] = call MLME_GET.macBSN();
+ m_beaconFrame.header->mhr[MHR_INDEX_SEQNO] = call MLME_GET.macBSN() + 1;
offset = MHR_INDEX_ADDRESS;
*((nxle_uint16_t*) &m_beaconFrame.header->mhr[offset]) = m_updatePANId;
offset += sizeof(ieee154_macPANId_t);
task void txDoneTask()
{
- call MLME_SET.macBSN(m_beaconFrame.header->mhr[MHR_INDEX_SEQNO]+1);
+ call MLME_SET.macBSN(m_beaconFrame.header->mhr[MHR_INDEX_SEQNO]);
m_beaconFrame.header->mhr[MHR_INDEX_SEQNO] += 1; // may be overwritten by the next higher layer
call SetMacBeaconTxTime.set(m_lastBeaconTxTime); // start of slot0, ie. first preamble byte of beacon
call BeaconPayloadUpdateTimer.startOneShotAt(m_lastBeaconTxTime,
} // end atomic (give BeaconSendAlarm.fired() the chance to execute)
signal IEEE154TxBeaconPayload.aboutToTransmit();
- m_beaconFrame.header->mhr[MHR_INDEX_SEQNO] = call MLME_GET.macBSN();
+ m_beaconFrame.header->mhr[MHR_INDEX_SEQNO] = call MLME_GET.macBSN() + 1;
atomic {
// (4) try to update beacon payload
};
int m_numPending;
uint8_t m_dataRequestCmdID = CMD_FRAME_DATA_REQUEST;
- void buildDataRequestFrame( uint8_t destAddrMode, uint16_t destPANId,
+ void assembleDataRequestFrame( uint8_t destAddrMode, uint16_t destPANId,
uint8_t* DstAddr, uint8_t srcAddrMode, ieee154_txframe_t *txFrame);
command error_t Init.init()
txFrame->handle = HANDLE_MLME_POLL_REQUEST;
if (call MLME_GET.macShortAddress() >= 0xFFFE)
srcAddrMode = 3;
- buildDataRequestFrame(coordAddrMode, coordPANID, coordAddressLE, srcAddrMode, txFrame);
+ assembleDataRequestFrame(coordAddrMode, coordPANID, coordAddressLE, srcAddrMode, txFrame);
if ((status = call PollTx.transmit(txFrame)) != IEEE154_SUCCESS) {
call TxFramePool.put(txFrame);
call TxControlPool.put(txControl);
signal DataRequest.pollDone[client]();
return IEEE154_SUCCESS;
} else if ((txFrame = call TxFramePool.get()) != NULL) {
- if ((txControl = call TxControlPool.get()) != NULL)
- call TxFramePool.put(txFrame);
- else {
+ if ((txControl = call TxControlPool.get()) != NULL) {
txFrame->header = &txControl->header;
txFrame->metadata = &txControl->metadata;
txFrame->handle = client;
- buildDataRequestFrame(CoordAddrMode, CoordPANId,
+ assembleDataRequestFrame(CoordAddrMode, CoordPANId,
CoordAddressLE, srcAddrMode, txFrame);
if ((status = call PollTx.transmit(txFrame)) != IEEE154_SUCCESS) {
call TxControlPool.put(txControl);
call TxFramePool.put(txFrame);
- dbg_serial("PollP", "Overflow\n");
+ dbg_serial("PollP", "Tx Overflow\n");
} else
m_numPending++;
- }
+ } else {
+ call TxFramePool.put(txFrame);
+ }
}
+ dbg_serial("PollP", "Status %lu, numPending: %lu\n", (uint32_t) status, (uint32_t) m_numPending);
if (status != IEEE154_SUCCESS)
signal DataRequest.pollDone[client]();
- dbg_serial("PollP", "Status %lu, numPending: %lu\n", (uint32_t) status, (uint32_t) m_numPending);
return status;
}
- void buildDataRequestFrame(uint8_t destAddrMode, uint16_t destPANId,
+ void assembleDataRequestFrame(uint8_t destAddrMode, uint16_t destPANId,
uint8_t* destAddrPtrLE, uint8_t srcAddrMode, ieee154_txframe_t *txFrame)
{
// destAddrPtrLE points to an address in little-endian format !
event message_t* PhyRx.received(message_t *msg, const ieee154_timestamp_t *timestamp)
{
uint8_t *mhr = MHR(msg);
+
+ dbg("RadioControlImplP", "Received frame, DSN: %lu, type: 0x%lu\n",
+ (uint32_t) mhr[MHR_INDEX_SEQNO], (uint32_t) mhr[MHR_INDEX_FC1] & FC1_FRAMETYPE_MASK);
+
if (((mhr[1] & FC2_FRAME_VERSION_MASK) > FC2_FRAME_VERSION_1)
&& (!call RadioPromiscuousMode.get()))
return msg;
+
#ifndef IEEE154_SECURITY_ENABLED
if ((mhr[0] & FC1_SECURITY_ENABLED)
&& (!call RadioPromiscuousMode.get()))