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 > > &
156 m_state (UNASSOCIATED),
157 m_rtsBlocked (false),
162 m_ev = CreateObject<ExponentialRandomVariable> ();
189 std::list<std::pair <Ptr<Packet>,
Mac8Address > >::iterator it;
212 .SetGroupName (
"Uan")
214 .AddAttribute (
"RetryRate",
215 "Number of retry attempts per second (of RTS/GWPING).",
218 MakeDoubleChecker<double> ())
219 .AddAttribute (
"MaxFrames",
220 "Maximum number of frames to include in a single RTS.",
223 MakeUintegerChecker<uint32_t> ())
224 .AddAttribute (
"QueueLimit",
225 "Maximum packets to queue at MAC.",
228 MakeUintegerChecker<uint32_t> ())
229 .AddAttribute (
"SIFS",
230 "Spacing to give between frames (this should match gateway).",
234 .AddAttribute (
"NumberOfRates",
235 "Number of rate divisions supported by each PHY.",
238 MakeUintegerChecker<uint32_t> ())
239 .AddAttribute (
"MinRetryRate",
240 "Smallest allowed RTS retry rate.",
243 MakeDoubleChecker<double> ())
244 .AddAttribute (
"RetryStep",
245 "Retry rate increment.",
248 MakeDoubleChecker<double> ())
249 .AddAttribute (
"MaxPropDelay",
250 "Maximum possible propagation delay to gateway.",
254 .AddTraceSource (
"Enqueue",
255 "A (data) packet arrived at MAC for transmission.",
257 "ns3::UanMacRc::QueueTracedCallback")
258 .AddTraceSource (
"Dequeue",
259 "A (data) packet was passed down to PHY from MAC.",
261 "ns3::UanMacRc::QueueTracedCallback")
262 .AddTraceSource (
"RX",
263 "A packet was destined for and received at this MAC layer.",
265 "ns3::UanMac::PacketModeTracedCallback")
281 if (protocolNumber > 0)
283 NS_LOG_WARN (
"Warning: UanMacRc does not support multiple protocols. protocolNumber argument to Enqueue is being ignored");
344 " UanMacRc Receiving DATA packet from PHY");
367 if (winDelay >
Time (0))
398 " received CTS while state != RTSSENT or GWPING");
428 std::list<Reservation>::iterator it =
m_resList.begin ();
440 " received CTS packet with no corresponding reservation!");
445 " received CTS packet. Scheduling data");
446 it->SetTransmitted ();
460 const std::list<std::pair <Ptr<Packet>,
Mac8Address > > l = it->GetPktList ();
461 std::list<std::pair <Ptr<Packet>,
Mac8Address > >::const_iterator pit;
466 for (uint8_t i = 0; i < it->GetNoFrames (); i++, pit++)
481 Time eventTime = startDelay + frameDelay;
482 if (eventTime <
Time (0))
484 NS_FATAL_ERROR (
"Scheduling error resulted in very negative data transmission time! eventTime = " << eventTime.
As (
Time::S));
488 " scheduling with delay " << eventTime.
As (
Time::S) <<
490 " start delay " << startDelay.
As (
Time::S) <<
491 " arrival time " << arrTime.
As (
Time::S));
541 " transmitting " << pkt->
GetSize () <<
542 " byte packet of type " << type <<
" with rate " << rate <<
543 "(" <<
m_phy->GetMode (rate).GetDataRateBps () <<
") to " << ch.
GetDest ());
545 m_phy->SendPacket (pkt, rate);
554 std::list<Reservation>::iterator it =
m_resList.begin ();
564 NS_LOG_DEBUG (
"In " << __func__ <<
" could not find reservation corresponding to received ACK");
567 if (!it->IsTransmitted ())
573 const std::list<std::pair <Ptr<Packet>,
Mac8Address > > l = it->GetPktList ();
574 std::list<std::pair <Ptr<Packet>,
Mac8Address > >::const_iterator pit;
578 std::set<uint8_t>::iterator nit = nacks.begin ();
580 for (; nit != nacks.end (); nit++)
584 " Received NACK for " << (uint32_t) *nit);
599 " received ACK for all frames");
714 if (phyDual->IsPhy1Rx ())
750 " tried to retry RTS with empty reservation list");
a polymophic address class
This class can be used to hold variables of floating point type such as 'double' or 'float'.
bool IsRunning(void) const
This method is syntactic sugar for !IsExpired().
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::Cancel method.
double GetValue(double mean, double bound)
Get the next random value, as a double from the exponential distribution with the specified mean and ...
A class used for addressing MAC8 MAC's.
static Mac8Address GetBroadcast(void)
Get the broadcast address (255).
static Mac8Address ConvertFrom(const Address &address)
Convert a generic address to a Mac8Address.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
virtual void DoDispose(void)
Destructor implementation.
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
void AddHeader(const Header &header)
Add header to this packet.
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
void SetStream(int64_t stream)
Specifies the stream number for the RngStream.
Stores reservation info for use in scheduling data channel by reservation channel MAC.
std::list< std::pair< Ptr< Packet >, Mac8Address > > m_pktList
Queued packets for each address.
uint32_t GetNoFrames() const
Get the number of frames in this Reservation.
uint32_t GetLength() const
Get the total length of the Reservation.
~Reservation()
Destructor.
const std::list< std::pair< Ptr< Packet >, Mac8Address > > & GetPktList(void) const
Get the list of packets.
bool m_transmitted
Has this reservation been transmitted.
Reservation()
Default constructor.
Time GetTimestamp(uint8_t n) const
Get the timestamp for the n'th RTS.
uint8_t GetFrameNo() const
Get the frame number.
void IncrementRetry()
Increment the retry count.
uint8_t m_frameNo
Frame number.
void SetFrameNo(uint8_t fn)
Set the frame number.
bool IsTransmitted() const
uint8_t m_retryNo
Number of retries.
uint8_t GetRetryNo() const
Get the retry number.
uint32_t m_length
Total length of queued packets.
void SetTransmitted(bool t=true)
Set the reservation transmitted state.
void AddTimestamp(Time t)
Set the time of the latest RTS sent.
std::vector< Time > m_timestamp
Timestamps for each retry.
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
static Time Now(void)
Return the current simulation virtual time.
Simulation virtual time values and global simulation resolution.
TimeWithUnit As(const enum Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
AttributeValue implementation for Time.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Virtual base class for all UAN MAC protocols.
virtual Address GetAddress(void)
Get the MAC Address.
Non-gateway node MAC for reservation channel MAC protocol.
void SendPacket(Ptr< Packet > pkt, uint32_t rate)
Send on packet on the PHY.
void ReceiveOkFromPhy(Ptr< Packet > pkt, double sinr, UanTxMode mode)
PHY receive ok Callback.
void ScheduleData(const UanHeaderRcCts &ctsh, const UanHeaderRcCtsGlobal &ctsg, uint32_t ctsBytes)
Schedule Packet sends.
double m_retryRate
Number of retry attempts per second (of RTS/GWPING.
@ TYPE_GWPING
Gateway ping.
UanHeaderRcRts CreateRtsHeader(const Reservation &res)
Create the RTS header from a Reservation.
EventId m_startAgain
(Unused).
virtual void Clear(void)
Clears all pointer references.
uint32_t m_queueLimit
Maximum packets to queue at MAC.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
virtual void AttachPhy(Ptr< UanPhy > phy)
Attach PHY layer to this MAC.
EventId m_rtsEvent
The RTS event.
uint8_t m_frameNo
Current frame number.
Ptr< ExponentialRandomVariable > m_ev
Provides exponential random variables.
void DoDispose()
Destructor implementation.
Ptr< UanPhy > m_phy
PHY layer attached to this MAC.
double m_minRetryRate
Smallest allowed RTS retry rate.
void SendRts(void)
Send RTS packet.
double m_retryStep
Retry rate increment.
virtual bool Enqueue(Ptr< Packet > pkt, uint16_t protocolNumber, const Address &dest)
Enqueue packet to be transmitted.
uint32_t m_ctsSizeN
Size of UanHeaderRcCts.
Callback< void, Ptr< Packet >, uint16_t, const Mac8Address & > m_forwardUpCb
The callback to forward a packet up to higher layer.
UanMacRc()
Default constructor.
std::list< std::pair< Ptr< Packet >, Mac8Address > > m_pktQueue
Pending packets.
static uint32_t m_cntrlSends
Global count of calls to Associate, AssociateTimeout, SendRts, and RtsTimeout.
uint32_t m_ctsSizeG
Size of UanHeaderCommon and UanHeaderRcCtsGlobal.
Time m_learnedProp
Propagation delay to gateway.
uint32_t m_currentRate
Rate number corresponding to data rate of current cycle.
void ProcessAck(Ptr< Packet > ack)
Process a received ACK.
bool m_rtsBlocked
RTS blocked while processing ACK.
TracedCallback< Ptr< const Packet >, uint32_t > m_dequeueLogger
A was passed down to the PHY from the MAC.
virtual ~UanMacRc()
Dummy destructor, DoDispose.
std::list< Reservation > m_resList
List of scheduled reservations.
Time m_sifs
Spacing between frames to account for timing error and processing delay.
bool IsPhy1Ok(void)
Check that PHY is ok: not CTS or ACK not to my address.
void BlockRtsing(void)
Callback to block RST.
TracedCallback< Ptr< const Packet >, UanTxMode > m_rxLogger
A packet was destined for and received at this MAC layer.
Mac8Address m_assocAddr
Next hop address.
void Associate(void)
Associate with a gateway by sending the first GWPING.
bool m_cleared
Flag when we've been cleared.
uint32_t m_maxFrames
Maximum number of frames to include in a single RTS.
TracedCallback< Ptr< const Packet >, uint32_t > m_enqueueLogger
A packet arrived at the MAC for transmission.
@ IDLE
Finished scheduling packet sends.
@ GWPSENT
Associated with gateway.
@ UNASSOCIATED
Initial state.
uint32_t m_numRates
Number of rates per Phy layer.
virtual void SetForwardUpCb(Callback< void, Ptr< Packet >, uint16_t, const Mac8Address & > cb)
Set the callback to forward packets up to higher layers.
static TypeId GetTypeId(void)
Register this type.
void AssociateTimeout(void)
Periodically retry association.
void RtsTimeout(void)
Retry RTS.
Abstraction of packet modulation information.
Hold an unsigned integer type.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Time Seconds(double value)
Construct a Time in the indicated unit.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...