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" 56 : m_frameNo (frameNo),
60 uint32_t numPkts = (maxPkts) ? maxPkts : static_cast<uint32_t> (
list.size ());
65 for (uint32_t i = 0; i < numPkts; i++)
67 length +=
list.front ().first->GetSize () +
78 std::list<std::pair <Ptr<Packet>,
Mac8Address > >::iterator it;
89 return static_cast<uint32_t
> (
m_pktList.size ());
98 const std::list<std::pair <Ptr<Packet>,
Mac8Address > > &
157 m_state (UNASSOCIATED),
158 m_rtsBlocked (false),
163 m_ev = CreateObject<ExponentialRandomVariable> ();
190 std::list<std::pair <Ptr<Packet>,
Mac8Address > >::iterator it;
213 .SetGroupName (
"Uan")
215 .AddAttribute (
"RetryRate",
216 "Number of retry attempts per second (of RTS/GWPING).",
219 MakeDoubleChecker<double> ())
220 .AddAttribute (
"MaxFrames",
221 "Maximum number of frames to include in a single RTS.",
224 MakeUintegerChecker<uint32_t> ())
225 .AddAttribute (
"QueueLimit",
226 "Maximum packets to queue at MAC.",
229 MakeUintegerChecker<uint32_t> ())
230 .AddAttribute (
"SIFS",
231 "Spacing to give between frames (this should match gateway).",
235 .AddAttribute (
"NumberOfRates",
236 "Number of rate divisions supported by each PHY.",
239 MakeUintegerChecker<uint32_t> ())
240 .AddAttribute (
"MinRetryRate",
241 "Smallest allowed RTS retry rate.",
244 MakeDoubleChecker<double> ())
245 .AddAttribute (
"RetryStep",
246 "Retry rate increment.",
249 MakeDoubleChecker<double> ())
250 .AddAttribute (
"MaxPropDelay",
251 "Maximum possible propagation delay to gateway.",
255 .AddTraceSource (
"Enqueue",
256 "A (data) packet arrived at MAC for transmission.",
258 "ns3::UanMacRc::QueueTracedCallback")
259 .AddTraceSource (
"Dequeue",
260 "A (data) packet was passed down to PHY from MAC.",
262 "ns3::UanMacRc::QueueTracedCallback")
263 .AddTraceSource (
"RX",
264 "A packet was destined for and received at this MAC layer.",
266 "ns3::UanMac::PacketModeTracedCallback")
282 if (protocolNumber > 0)
284 NS_LOG_WARN (
"Warning: UanMacRc does not support multiple protocols. protocolNumber argument to Enqueue is being ignored");
426 std::list<Reservation>::iterator it =
m_resList.begin ();
440 it->SetTransmitted ();
454 const std::list<std::pair <Ptr<Packet>,
Mac8Address > > l = it->GetPktList ();
455 std::list<std::pair <Ptr<Packet>,
Mac8Address > >::const_iterator pit;
460 for (uint8_t i = 0; i < it->GetNoFrames (); i++, pit++)
475 Time eventTime = startDelay + frameDelay;
484 NS_FATAL_ERROR (
"Scheduling error resulted in very negative data transmission time! eventTime = " << eventTime.
GetSeconds ());
537 m_phy->SendPacket (pkt, rate);
546 std::list<Reservation>::iterator it =
m_resList.begin ();
556 NS_LOG_DEBUG (
"In " << __func__ <<
" could not find reservation corresponding to received ACK");
559 if (!it->IsTransmitted ())
565 const std::list<std::pair <Ptr<Packet>,
Mac8Address > > l = it->GetPktList ();
566 std::list<std::pair <Ptr<Packet>,
Mac8Address > >::const_iterator pit;
570 std::set<uint8_t>::iterator nit = nacks.begin ();
572 for (; nit != nacks.end (); nit++)
648 res.IncrementRetry ();
702 if (phyDual->IsPhy1Rx ())
744 res.IncrementRetry ();
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
Simulation virtual time values and global simulation resolution.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
void SetStream(int64_t stream)
Specifies the stream number for the RngStream.
Mac8Address m_address
My addrese.s.
void RtsTimeout(void)
Retry RTS.
EventId m_startAgain
(Unused).
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
bool IsPhy1Ok(void)
Check that PHY is ok: not CTS or ACK not to my address.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
uint32_t m_maxFrames
Maximum number of frames to include in a single RTS.
void DoDispose()
Destructor implementation.
void AddTimestamp(Time t)
Set the time of the latest RTS sent.
uint8_t m_frameNo
Frame number.
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
virtual ~UanMacRc()
Dummy destructor, DoDispose.
#define NS_UNUSED(x)
Mark a local variable as unused.
static Mac8Address GetBroadcast(void)
Get the broadcast address (255).
uint8_t m_frameNo
Current frame number.
Time m_learnedProp
Propagation delay to gateway.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
virtual void DoDispose(void)
Destructor implementation.
uint32_t GetNoFrames() const
Get the number of frames in this Reservation.
UanHeaderRcRts CreateRtsHeader(const Reservation &res)
Create the RTS header from a Reservation.
bool IsTransmitted() const
void ProcessAck(Ptr< Packet > ack)
Process a received ACK.
uint8_t m_retryNo
Number of retries.
std::list< std::pair< Ptr< Packet >, Mac8Address > > m_pktQueue
Pending packets.
uint32_t GetLength() const
Get the total length of the Reservation.
void ReceiveOkFromPhy(Ptr< Packet > pkt, double sinr, UanTxMode mode)
PHY receive ok Callback.
Non-gateway node MAC for reservation channel MAC protocol.
uint32_t m_length
Total length of queued packets.
a polymophic address class
uint8_t GetFrameNo() const
Get the frame number.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
void BlockRtsing(void)
Callback to block RST.
void SetTransmitted(bool t=true)
Set the reservation transmitted state.
Callback< void, Ptr< Packet >, uint16_t, const Mac8Address & > m_forwardUpCb
The callback to forward a packet up to higher layer.
Virtual base class for all UAN MAC protocols.
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay.
Reservation()
Default constructor.
std::vector< Time > m_timestamp
Timestamps for each retry.
AttributeValue implementation for Time.
TracedCallback< Ptr< const Packet >, uint32_t > m_dequeueLogger
A was passed down to the PHY from the MAC.
virtual Address GetAddress(void)
Get the MAC Address.
virtual void Clear(void)
Clears all pointer references.
Hold an unsigned integer type.
double m_minRetryRate
Smallest allowed RTS retry rate.
Abstraction of packet modulation information.
std::list< std::pair< Ptr< Packet >, Mac8Address > > m_pktList
Queued packets for each address.
double m_retryStep
Retry rate increment.
A class used for addressing MAC8 MAC's.
const std::list< std::pair< Ptr< Packet >, Mac8Address > > & GetPktList(void) const
Get the list of packets.
Finished scheduling packet sends.
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
TracedCallback< Ptr< const Packet >, UanTxMode > m_rxLogger
A packet was destined for and received at this MAC layer.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Ptr< ExponentialRandomVariable > m_ev
Provides exponential random variables.
Ptr< UanPhy > m_phy
PHY layer attached to this MAC.
static uint32_t m_cntrlSends
Global count of calls to Associate, AssociateTimeout, SendRts, and RtsTimeout.
void AssociateTimeout(void)
Periodically retry association.
void SetFrameNo(uint8_t fn)
Set the frame number.
bool m_cleared
Flag when we've been cleared.
UanMacRc()
Default constructor.
static TypeId GetTypeId(void)
Register this type.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
virtual bool Enqueue(Ptr< Packet > pkt, uint16_t protocolNumber, const Address &dest)
Enqueue packet to be transmitted.
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
EventId m_rtsEvent
The RTS event.
double m_retryRate
Number of retry attempts per second (of RTS/GWPING.
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
static Time Now(void)
Return the current simulation virtual time.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
bool m_rtsBlocked
RTS blocked while processing ACK.
TracedCallback< Ptr< const Packet >, uint32_t > m_enqueueLogger
A packet arrived at the MAC for transmission.
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
std::list< Reservation > m_resList
List of scheduled reservations.
Time m_sifs
Spacing between frames to account for timing error and processing delay.
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
virtual void SetForwardUpCb(Callback< void, Ptr< Packet >, uint16_t, const Mac8Address &> cb)
Set the callback to forward packets up to higher layers.
virtual void AttachPhy(Ptr< UanPhy > phy)
Attach PHY layer to this MAC.
void SendRts(void)
Send RTS packet.
void ScheduleData(const UanHeaderRcCts &ctsh, const UanHeaderRcCtsGlobal &ctsg, uint32_t ctsBytes)
Schedule Packet sends.
void SendPacket(Ptr< Packet > pkt, uint32_t rate)
Send on packet on the PHY.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Stores reservation info for use in scheduling data channel by reservation channel MAC...
Time Seconds(double value)
Construct a Time in the indicated unit.
uint8_t GetRetryNo() const
Get the retry number.
uint32_t m_numRates
Number of rates per Phy layer.
bool IsRunning(void) const
This method is syntactic sugar for !IsExpired().
double GetValue(double mean, double bound)
Get the next random value, as a double from the exponential distribution with the specified mean and ...
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::Cancel method.
uint32_t m_queueLimit
Maximum packets to queue at MAC.
uint32_t m_currentRate
Rate number corresponding to data rate of current cycle.
uint32_t m_ctsSizeN
Size of UanHeaderRcCts.
Time GetTimestamp(uint8_t n) const
Get the timestamp for the n'th RTS.
bool m_transmitted
Has this reservation been transmitted.
This class can be used to hold variables of floating point type such as 'double' or 'float'...
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Mac8Address m_assocAddr
Next hop address.
a unique identifier for an interface.
void Associate(void)
Associate with a gateway by sending the first GWPING.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
static Mac8Address ConvertFrom(const Address &address)
Convert a generic address to a Mac8Address.
void IncrementRetry()
Increment the retry count.
uint32_t m_ctsSizeG
Size of UanHeaderCommon and UanHeaderRcCtsGlobal.
void AddHeader(const Header &header)
Add header to this packet.
~Reservation()
Destructor.