|
228 |
****************************************************************/ |
228 |
****************************************************************/ |
229 |
|
229 |
|
230 |
DcfManager::DcfManager () |
230 |
DcfManager::DcfManager () |
231 |
: m_lastAckTimeoutEnd (MicroSeconds (0)), |
231 |
: m_lastAckTimeoutEnd (0), |
232 |
m_lastCtsTimeoutEnd (MicroSeconds (0)), |
232 |
m_lastCtsTimeoutEnd (0), |
233 |
m_lastNavStart (MicroSeconds (0)), |
233 |
m_lastNavStart (0), |
234 |
m_lastNavDuration (MicroSeconds (0)), |
234 |
m_lastNavDuration (0), |
235 |
m_lastRxStart (MicroSeconds (0)), |
235 |
m_lastRxStart (0), |
236 |
m_lastRxDuration (MicroSeconds (0)), |
236 |
m_lastRxDuration (0), |
237 |
m_lastRxReceivedOk (true), |
237 |
m_lastRxReceivedOk (true), |
238 |
m_lastRxEnd (MicroSeconds (0)), |
238 |
m_lastRxEnd (0), |
239 |
m_lastTxStart (MicroSeconds (0)), |
239 |
m_lastTxStart (0), |
240 |
m_lastTxDuration (MicroSeconds (0)), |
240 |
m_lastTxDuration (0), |
241 |
m_lastBusyStart (MicroSeconds (0)), |
241 |
m_lastBusyStart (0), |
242 |
m_lastBusyDuration (MicroSeconds (0)), |
242 |
m_lastBusyDuration (0), |
243 |
m_lastSwitchingStart (MicroSeconds (0)), |
243 |
m_lastSwitchingStart (0), |
244 |
m_lastSwitchingDuration (MicroSeconds (0)), |
244 |
m_lastSwitchingDuration (0), |
245 |
m_rxing (false), |
245 |
m_rxing (false), |
246 |
m_slotTimeUs (0), |
246 |
m_slotTimeUs (0), |
247 |
m_sifs (Seconds (0.0)), |
247 |
m_sifs (Seconds (0.0)), |
|
340 |
Time retval = Max (k, l); |
340 |
Time retval = Max (k, l); |
341 |
return retval; |
341 |
return retval; |
342 |
} |
342 |
} |
|
|
343 |
uint64_t |
344 |
DcfManager::Maximum (uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e, uint64_t f, uint64_t g) const |
345 |
{ |
346 |
uint64_t h = a > b ? a : b; |
347 |
uint64_t i = c > d ? c: d; |
348 |
uint64_t j = e > f ? e : f; |
349 |
uint64_t k = h > i ? h : i; |
350 |
uint64_t l = j > g ? j : g; |
351 |
return (k > l ? k : l); |
352 |
} |
343 |
|
353 |
|
344 |
bool |
354 |
bool |
345 |
DcfManager::IsBusy (void) const |
355 |
DcfManager::IsBusy (void) const |
346 |
{ |
356 |
{ |
347 |
// PHY busy |
357 |
// PHY busy |
|
|
358 |
uint64_t now = Simulator::Now ().GetNanoSeconds (); |
348 |
if (m_rxing) |
359 |
if (m_rxing) |
349 |
{ |
360 |
{ |
350 |
return true; |
361 |
return true; |
351 |
} |
362 |
} |
352 |
Time lastTxEnd = m_lastTxStart + m_lastTxDuration; |
363 |
uint64_t lastTxEnd = m_lastTxStart + m_lastTxDuration; |
353 |
if (lastTxEnd > Simulator::Now ()) |
364 |
if (lastTxEnd > now) |
354 |
{ |
365 |
{ |
355 |
return true; |
366 |
return true; |
356 |
} |
367 |
} |
357 |
// NAV busy |
368 |
// NAV busy |
358 |
Time lastNavEnd = m_lastNavStart + m_lastNavDuration; |
369 |
uint64_t lastNavEnd = m_lastNavStart + m_lastNavDuration; |
359 |
if (lastNavEnd > Simulator::Now ()) |
370 |
if (lastNavEnd > now) |
360 |
{ |
371 |
{ |
361 |
return true; |
372 |
return true; |
362 |
} |
373 |
} |
|
454 |
Time |
465 |
Time |
455 |
DcfManager::GetAccessGrantStart (void) const |
466 |
DcfManager::GetAccessGrantStart (void) const |
456 |
{ |
467 |
{ |
457 |
Time rxAccessStart; |
468 |
uint64_t rxAccessStart; |
|
|
469 |
uint64_t sifsNanoSeconds = m_sifs.GetNanoSeconds (); |
458 |
if (!m_rxing) |
470 |
if (!m_rxing) |
459 |
{ |
471 |
{ |
460 |
rxAccessStart = m_lastRxEnd + m_sifs; |
472 |
rxAccessStart = m_lastRxEnd + sifsNanoSeconds; |
461 |
if (!m_lastRxReceivedOk) |
473 |
if (!m_lastRxReceivedOk) |
462 |
{ |
474 |
{ |
463 |
rxAccessStart += m_eifsNoDifs; |
475 |
rxAccessStart += m_eifsNoDifs.GetNanoSeconds (); |
464 |
} |
476 |
} |
465 |
} |
477 |
} |
466 |
else |
478 |
else |
467 |
{ |
479 |
{ |
468 |
rxAccessStart = m_lastRxStart + m_lastRxDuration + m_sifs; |
480 |
rxAccessStart = m_lastRxStart + m_lastRxDuration + m_sifs.GetNanoSeconds (); |
469 |
} |
481 |
} |
470 |
Time busyAccessStart = m_lastBusyStart + m_lastBusyDuration + m_sifs; |
482 |
uint64_t busyAccessStart = m_lastBusyStart + m_lastBusyDuration + sifsNanoSeconds; |
471 |
Time txAccessStart = m_lastTxStart + m_lastTxDuration + m_sifs; |
483 |
uint64_t txAccessStart = m_lastTxStart + m_lastTxDuration + sifsNanoSeconds; |
472 |
Time navAccessStart = m_lastNavStart + m_lastNavDuration + m_sifs; |
484 |
uint64_t navAccessStart = m_lastNavStart + m_lastNavDuration + sifsNanoSeconds; |
473 |
Time ackTimeoutAccessStart = m_lastAckTimeoutEnd + m_sifs; |
485 |
uint64_t ackTimeoutAccessStart = m_lastAckTimeoutEnd + sifsNanoSeconds; |
474 |
Time ctsTimeoutAccessStart = m_lastCtsTimeoutEnd + m_sifs; |
486 |
uint64_t ctsTimeoutAccessStart = m_lastCtsTimeoutEnd + sifsNanoSeconds; |
475 |
Time switchingAccessStart = m_lastSwitchingStart + m_lastSwitchingDuration + m_sifs; |
487 |
uint64_t switchingAccessStart = m_lastSwitchingStart + m_lastSwitchingDuration + sifsNanoSeconds; |
476 |
Time accessGrantedStart = MostRecent (rxAccessStart, |
488 |
uint64_t accessGrantedStart = Maximum (rxAccessStart, |
477 |
busyAccessStart, |
489 |
busyAccessStart, |
478 |
txAccessStart, |
490 |
txAccessStart, |
479 |
navAccessStart, |
491 |
navAccessStart, |
480 |
ackTimeoutAccessStart, |
492 |
ackTimeoutAccessStart, |
481 |
ctsTimeoutAccessStart, |
493 |
ctsTimeoutAccessStart, |
482 |
switchingAccessStart |
494 |
switchingAccessStart |
483 |
); |
495 |
); |
484 |
NS_LOG_INFO ("access grant start=" << accessGrantedStart << |
496 |
NS_LOG_INFO ("access grant start=" << accessGrantedStart << |
485 |
", rx access start=" << rxAccessStart << |
497 |
", rx access start=" << rxAccessStart << |
486 |
", busy access start=" << busyAccessStart << |
498 |
", busy access start=" << busyAccessStart << |
487 |
", tx access start=" << txAccessStart << |
499 |
", tx access start=" << txAccessStart << |
488 |
", nav access start=" << navAccessStart); |
500 |
", nav access start=" << navAccessStart); |
489 |
return accessGrantedStart; |
501 |
return NanoSeconds (accessGrantedStart); |
490 |
} |
502 |
} |
491 |
|
503 |
|
492 |
Time |
504 |
Time |
|
569 |
{ |
581 |
{ |
570 |
MY_DEBUG ("rx start for="<<duration); |
582 |
MY_DEBUG ("rx start for="<<duration); |
571 |
UpdateBackoff (); |
583 |
UpdateBackoff (); |
572 |
m_lastRxStart = Simulator::Now (); |
584 |
m_lastRxStart = Simulator::Now ().GetNanoSeconds (); |
573 |
m_lastRxDuration = duration; |
585 |
m_lastRxDuration = duration.GetNanoSeconds (); |
574 |
m_rxing = true; |
586 |
m_rxing = true; |
575 |
} |
587 |
} |
576 |
void |
588 |
void |
577 |
DcfManager::NotifyRxEndOkNow (void) |
589 |
DcfManager::NotifyRxEndOkNow (void) |
578 |
{ |
590 |
{ |
579 |
MY_DEBUG ("rx end ok"); |
591 |
MY_DEBUG ("rx end ok"); |
580 |
m_lastRxEnd = Simulator::Now (); |
592 |
m_lastRxEnd = Simulator::Now ().GetNanoSeconds (); |
581 |
m_lastRxReceivedOk = true; |
593 |
m_lastRxReceivedOk = true; |
582 |
m_rxing = false; |
594 |
m_rxing = false; |
583 |
} |
595 |
} |
|
585 |
DcfManager::NotifyRxEndErrorNow (void) |
597 |
DcfManager::NotifyRxEndErrorNow (void) |
586 |
{ |
598 |
{ |
587 |
MY_DEBUG ("rx end error"); |
599 |
MY_DEBUG ("rx end error"); |
588 |
m_lastRxEnd = Simulator::Now (); |
600 |
m_lastRxEnd = Simulator::Now ().GetNanoSeconds (); |
589 |
m_lastRxReceivedOk = false; |
601 |
m_lastRxReceivedOk = false; |
590 |
m_rxing = false; |
602 |
m_rxing = false; |
591 |
} |
603 |
} |
|
597 |
//this may be caused only if PHY has started to receive a packet |
609 |
//this may be caused only if PHY has started to receive a packet |
598 |
//inside SIFS, so, we check that lastRxStart was maximum a SIFS |
610 |
//inside SIFS, so, we check that lastRxStart was maximum a SIFS |
599 |
//ago |
611 |
//ago |
600 |
NS_ASSERT (Simulator::Now () - m_lastRxStart <= m_sifs); |
612 |
NS_ASSERT (Simulator::Now () - NanoSeconds (m_lastRxStart) <= m_sifs); |
601 |
m_lastRxEnd = Simulator::Now (); |
613 |
m_lastRxEnd = Simulator::Now ().GetNanoSeconds (); |
602 |
m_lastRxDuration = m_lastRxEnd - m_lastRxStart; |
614 |
m_lastRxDuration = m_lastRxEnd - m_lastRxStart; |
603 |
m_lastRxReceivedOk = true; |
615 |
m_lastRxReceivedOk = true; |
604 |
m_rxing = false; |
616 |
m_rxing = false; |
605 |
} |
617 |
} |
606 |
MY_DEBUG ("tx start for "<<duration); |
618 |
MY_DEBUG ("tx start for "<<duration); |
607 |
UpdateBackoff (); |
619 |
UpdateBackoff (); |
608 |
m_lastTxStart = Simulator::Now (); |
620 |
m_lastTxStart = Simulator::Now ().GetNanoSeconds (); |
609 |
m_lastTxDuration = duration; |
621 |
m_lastTxDuration = duration.GetNanoSeconds (); |
610 |
} |
622 |
} |
611 |
void |
623 |
void |
612 |
DcfManager::NotifyMaybeCcaBusyStartNow (Time duration) |
624 |
DcfManager::NotifyMaybeCcaBusyStartNow (Time duration) |
613 |
{ |
625 |
{ |
614 |
MY_DEBUG ("busy start for "<<duration); |
626 |
MY_DEBUG ("busy start for "<<duration); |
615 |
UpdateBackoff (); |
627 |
UpdateBackoff (); |
616 |
m_lastBusyStart = Simulator::Now (); |
628 |
m_lastBusyStart = Simulator::Now ().GetNanoSeconds (); |
617 |
m_lastBusyDuration = duration; |
629 |
m_lastBusyDuration = duration.GetNanoSeconds (); |
618 |
} |
630 |
} |
619 |
|
631 |
|
620 |
|
632 |
|
621 |
void |
633 |
void |
622 |
DcfManager::NotifySwitchingStartNow (Time duration) |
634 |
DcfManager::NotifySwitchingStartNow (Time duration) |
623 |
{ |
635 |
{ |
624 |
Time now = Simulator::Now (); |
636 |
uint64_t now = Simulator::Now ().GetNanoSeconds (); |
625 |
NS_ASSERT (m_lastTxStart + m_lastTxDuration <= now); |
637 |
NS_ASSERT (m_lastTxStart + m_lastTxDuration <= now); |
626 |
NS_ASSERT (m_lastSwitchingStart + m_lastSwitchingDuration <= now); |
638 |
NS_ASSERT (m_lastSwitchingStart + m_lastSwitchingDuration <= now); |
627 |
|
639 |
|
628 |
if (m_rxing) |
640 |
if (m_rxing) |
629 |
{ |
641 |
{ |
630 |
// channel switching during packet reception |
642 |
// channel switching during packet reception |
631 |
m_lastRxEnd = Simulator::Now (); |
643 |
m_lastRxEnd = Simulator::Now ().GetNanoSeconds (); |
632 |
m_lastRxDuration = m_lastRxEnd - m_lastRxStart; |
644 |
m_lastRxDuration = m_lastRxEnd - m_lastRxStart; |
633 |
m_lastRxReceivedOk = true; |
645 |
m_lastRxReceivedOk = true; |
634 |
m_rxing = false; |
646 |
m_rxing = false; |
|
663 |
uint32_t remainingSlots = state->GetBackoffSlots (); |
675 |
uint32_t remainingSlots = state->GetBackoffSlots (); |
664 |
if (remainingSlots > 0) |
676 |
if (remainingSlots > 0) |
665 |
{ |
677 |
{ |
666 |
state->UpdateBackoffSlotsNow (remainingSlots, now); |
678 |
state->UpdateBackoffSlotsNow (remainingSlots, NanoSeconds(now)); |
667 |
NS_ASSERT(state->GetBackoffSlots()==0); |
679 |
NS_ASSERT(state->GetBackoffSlots()==0); |
668 |
} |
680 |
} |
669 |
state->ResetCw(); |
681 |
state->ResetCw(); |
|
672 |
} |
684 |
} |
673 |
|
685 |
|
674 |
MY_DEBUG ("switching start for "<<duration); |
686 |
MY_DEBUG ("switching start for "<<duration); |
675 |
m_lastSwitchingStart = Simulator::Now (); |
687 |
m_lastSwitchingStart = Simulator::Now ().GetNanoSeconds (); |
676 |
m_lastSwitchingDuration = duration; |
688 |
m_lastSwitchingDuration = duration.GetNanoSeconds (); |
677 |
|
689 |
|
678 |
} |
690 |
} |
679 |
|
691 |
|
|
682 |
{ |
694 |
{ |
683 |
MY_DEBUG ("nav reset for="<<duration); |
695 |
MY_DEBUG ("nav reset for="<<duration); |
684 |
UpdateBackoff (); |
696 |
UpdateBackoff (); |
685 |
m_lastNavStart = Simulator::Now (); |
697 |
m_lastNavStart = Simulator::Now ().GetNanoSeconds (); |
686 |
m_lastNavDuration = duration; |
698 |
m_lastNavDuration = duration.GetNanoSeconds (); |
687 |
UpdateBackoff (); |
699 |
UpdateBackoff (); |
688 |
/** |
700 |
/** |
689 |
* If the nav reset indicates an end-of-nav which is earlier |
701 |
* If the nav reset indicates an end-of-nav which is earlier |
|
696 |
void |
708 |
void |
697 |
DcfManager::NotifyNavStartNow (Time duration) |
709 |
DcfManager::NotifyNavStartNow (Time duration) |
698 |
{ |
710 |
{ |
699 |
NS_ASSERT (m_lastNavStart < Simulator::Now ()); |
711 |
NS_ASSERT (NanoSeconds (m_lastNavStart) < Simulator::Now ()); |
700 |
MY_DEBUG ("nav start for="<<duration); |
712 |
MY_DEBUG ("nav start for="<<duration); |
701 |
UpdateBackoff (); |
713 |
UpdateBackoff (); |
702 |
Time newNavEnd = Simulator::Now () + duration; |
714 |
uint64_t newNavEnd = (Simulator::Now () + duration).GetNanoSeconds (); |
703 |
Time lastNavEnd = m_lastNavStart + m_lastNavDuration; |
715 |
uint64_t lastNavEnd = m_lastNavStart + m_lastNavDuration; |
704 |
if (newNavEnd > lastNavEnd) |
716 |
if (newNavEnd > lastNavEnd) |
705 |
{ |
717 |
{ |
706 |
m_lastNavStart = Simulator::Now (); |
718 |
m_lastNavStart = Simulator::Now ().GetNanoSeconds (); |
707 |
m_lastNavDuration = duration; |
719 |
m_lastNavDuration = duration.GetNanoSeconds (); |
708 |
} |
720 |
} |
709 |
} |
721 |
} |
710 |
void |
722 |
void |
711 |
DcfManager::NotifyAckTimeoutStartNow (Time duration) |
723 |
DcfManager::NotifyAckTimeoutStartNow (Time duration) |
712 |
{ |
724 |
{ |
713 |
NS_ASSERT(m_lastAckTimeoutEnd < Simulator::Now ()); |
725 |
NS_ASSERT(NanoSeconds(m_lastAckTimeoutEnd) < Simulator::Now ()); |
714 |
m_lastAckTimeoutEnd = Simulator::Now () + duration; |
726 |
m_lastAckTimeoutEnd = (Simulator::Now () + duration).GetNanoSeconds (); |
715 |
} |
727 |
} |
716 |
void |
728 |
void |
717 |
DcfManager::NotifyAckTimeoutResetNow () |
729 |
DcfManager::NotifyAckTimeoutResetNow () |
718 |
{ |
730 |
{ |
719 |
m_lastAckTimeoutEnd = Simulator::Now (); |
731 |
m_lastAckTimeoutEnd = Simulator::Now ().GetNanoSeconds (); |
720 |
DoRestartAccessTimeoutIfNeeded (); |
732 |
DoRestartAccessTimeoutIfNeeded (); |
721 |
} |
733 |
} |
722 |
void |
734 |
void |
723 |
DcfManager::NotifyCtsTimeoutStartNow (Time duration) |
735 |
DcfManager::NotifyCtsTimeoutStartNow (Time duration) |
724 |
{ |
736 |
{ |
725 |
m_lastCtsTimeoutEnd = Simulator::Now () + duration; |
737 |
m_lastCtsTimeoutEnd = (Simulator::Now () + duration).GetNanoSeconds (); |
726 |
} |
738 |
} |
727 |
void |
739 |
void |
728 |
DcfManager::NotifyCtsTimeoutResetNow () |
740 |
DcfManager::NotifyCtsTimeoutResetNow () |
729 |
{ |
741 |
{ |
730 |
m_lastCtsTimeoutEnd = Simulator::Now (); |
742 |
m_lastCtsTimeoutEnd = Simulator::Now ().GetNanoSeconds (); |
731 |
DoRestartAccessTimeoutIfNeeded (); |
743 |
DoRestartAccessTimeoutIfNeeded (); |
732 |
} |
744 |
} |
733 |
} // namespace ns3 |
745 |
} // namespace ns3 |