29 #include "ns3/nstime.h"
30 #include "ns3/simulator.h"
31 #include "ns3/assert.h"
32 #include "ns3/double.h"
33 #include "ns3/uinteger.h"
55 : m_frameNo (frameNo),
59 uint32_t numPkts = (maxPkts) ? maxPkts :
list.size ();
64 for (uint32_t i = 0; i < numPkts; i++)
66 length +=
list.front ().first->GetSize () +
77 std::list<std::pair <Ptr<Packet>,
UanAddress > >::iterator it;
97 const std::list<std::pair <Ptr<Packet>,
UanAddress > > &
155 m_state (UNASSOCIATED),
156 m_rtsBlocked (false),
161 m_ev = CreateObject<ExponentialRandomVariable> ();
188 std::list<std::pair <Ptr<Packet>,
UanAddress > >::iterator it;
211 .AddConstructor<UanMacRc> ()
212 .AddAttribute (
"RetryRate",
213 "Number of retry attempts per second (of RTS/GWPING)",
216 MakeDoubleChecker<double> ())
217 .AddAttribute (
"MaxFrames",
218 "Maximum number of frames to include in a single RTS",
221 MakeUintegerChecker<uint32_t> ())
222 .AddAttribute (
"QueueLimit",
223 "Maximum packets to queue at MAC",
226 MakeUintegerChecker<uint32_t> ())
227 .AddAttribute (
"SIFS",
228 "Spacing to give between frames (this should match gateway)",
232 .AddAttribute (
"NumberOfRates",
233 "Number of rate divisions supported by each PHY",
236 MakeUintegerChecker<uint32_t> ())
237 .AddAttribute (
"MinRetryRate",
238 "Smallest allowed RTS retry rate",
241 MakeDoubleChecker<double> ())
242 .AddAttribute (
"RetryStep",
243 "Retry rate increment",
246 MakeDoubleChecker<double> ())
247 .AddAttribute (
"NumberOfRetryRates",
248 "Number of retry rates",
251 MakeUintegerChecker<uint16_t> ())
252 .AddAttribute (
"MaxPropDelay",
253 "Maximum possible propagation delay to gateway",
257 .AddTraceSource (
"Enqueue",
258 "A (data) packet arrived at MAC for transmission",
260 .AddTraceSource (
"Dequeue",
261 "A (data) packet was passed down to PHY from MAC",
263 .AddTraceSource (
"RX",
264 "A packet was destined for and received at this MAC layer",
293 if (protocolNumber > 0)
295 NS_LOG_WARN (
"Warning: UanMacRc does not support multiple protocols. protocolNumber argument to Enqueue is being ignored");
443 std::list<Reservation>::iterator it =
m_resList.begin ();
457 it->SetTransmitted ();
471 const std::list<std::pair <Ptr<Packet>,
UanAddress > > l = it->GetPktList ();
472 std::list<std::pair <Ptr<Packet>,
UanAddress > >::const_iterator pit;
477 for (uint32_t i = 0; i < it->GetNoFrames (); i++, pit++)
492 Time eventTime = startDelay + frameDelay;
501 NS_FATAL_ERROR (
"Scheduling error resulted in very negative data transmission time! eventTime = " << eventTime.
GetSeconds ());
504 NS_LOG_DEBUG (Simulator::Now ().GetSeconds () <<
" Node " <<
m_address <<
" scheduling with delay " << eventTime.
GetSeconds () <<
" propDelay " << m_learnedProp.GetSeconds () <<
" start delay " << startDelay.
GetSeconds () <<
" arrival time " << arrTime.
GetSeconds ());
563 std::list<Reservation>::iterator it =
m_resList.begin ();
573 NS_LOG_DEBUG (
"In " << __func__ <<
" could not find reservation corresponding to received ACK");
576 if (!it->IsTransmitted ())
582 const std::list<std::pair <Ptr<Packet>,
UanAddress > > l = it->GetPktList ();
583 std::list<std::pair <Ptr<Packet>,
UanAddress > >::const_iterator pit;
587 std::set<uint8_t>::iterator nit = nacks.begin ();
589 for (; nit != nacks.end (); nit++)
665 res.IncrementRetry ();
719 if (phyDual->IsPhy1Rx ())
761 res.IncrementRetry ();