return SUCCESS;
}
- uint32_t getPersistenceTime()
+ uint32_t getPersistenceTimeSymbols()
{
- uint32_t persistenceTime;
- persistenceTime = call MLME_GET.macTransactionPersistenceTime();
- persistenceTime *= IEEE154_aBaseSuperframeDuration;
- persistenceTime *= ((uint16_t) 1) << call MLME_GET.macBeaconOrder();
- return persistenceTime;
+ // transform macTransactionPersistenceTime PIB attribute
+ // from "unit periods" to symbols (cf. page 166)
+ uint32_t unitPeriod;
+ ieee154_macBeaconOrder_t BO = call MLME_GET.macBeaconOrder();
+
+ if (BO <= 14) {
+ unitPeriod = IEEE154_aBaseSuperframeDuration;
+ unitPeriod *= ((uint16_t) 1) << BO;
+ } else
+ unitPeriod = IEEE154_aBaseSuperframeDuration;
+ return unitPeriod * call MLME_GET.macTransactionPersistenceTime();
}
command ieee154_status_t Purge.purge(uint8_t msduHandle)
else if ((txFrame->header->mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) == FC2_DEST_MODE_EXTENDED)
m_numExtPending++;
if (!call IndirectTxTimeout.isRunning())
- call IndirectTxTimeout.startOneShot(getPersistenceTime());
+ call IndirectTxTimeout.startOneShot(getPersistenceTimeSymbols());
dbg_serial("IndirectTxP", "Preparing a transmission.\n");
signal PendingAddrSpecUpdated.notify(TRUE);
return IEEE154_SUCCESS;
{
// a transaction has expired
uint32_t now = call IndirectTxTimeout.getNow(), dt=0;
- uint32_t persistenceTime = getPersistenceTime();
+ uint32_t persistenceTime = getPersistenceTimeSymbols();
uint8_t i;
for (i=0; i<NUM_MAX_PENDING; i++)
if (m) {
k = 0;
while (k != m) {
- waitTime += ((uint16_t) 1 << (macMaxBE+k));
+ waitTime += ((uint16_t) 1 << (macMinBE+k));
k += 1;
}
}
waitTime *= IEEE154_aUnitBackoffPeriod;
- waitTime += IEEE154_SHR_DURATION;
+ waitTime += call MLME_GET.phyMaxFrameDuration();
m_pib.macMaxFrameTotalWaitTime = waitTime;
}