28 #include "ns3/assert.h"
30 #include "ns3/trace-source-accessor.h"
31 #include "ns3/nstime.h"
32 #include "ns3/double.h"
33 #include "ns3/uinteger.h"
86 std::map<Mac8Address, AckData>::iterator it =
m_ackData.begin ();
89 it->second.rxFrames.clear ();
107 .SetGroupName (
"Uan")
109 .AddAttribute (
"MaxReservations",
110 "Maximum number of reservations to accept per cycle.",
113 MakeUintegerChecker<uint32_t> ())
114 .AddAttribute (
"NumberOfRates",
115 "Number of rates per Phy layer.",
118 MakeUintegerChecker<uint32_t> ())
119 .AddAttribute (
"MaxPropDelay",
120 "Maximum propagation delay between gateway and non-gateway nodes.",
124 .AddAttribute (
"SIFS",
125 "Spacing between frames to account for timing error and processing delay.",
129 .AddAttribute (
"NumberOfNodes",
130 "Number of non-gateway nodes in this gateway's neighborhood.",
133 MakeUintegerChecker<uint32_t> ())
134 .AddAttribute (
"MinRetryRate",
135 "Smallest allowed RTS retry rate.",
138 MakeDoubleChecker<double> ())
139 .AddAttribute (
"RetryStep",
140 "Retry rate increment.",
143 MakeDoubleChecker<double> ())
144 .AddAttribute (
"TotalRate",
145 "Total available channel rate in bps (for a single channel, without splitting reservation channel).",
148 MakeUintegerChecker<uint32_t> ())
149 .AddAttribute (
"RateStep",
150 "Increments available for rate assignment in bps.",
153 MakeUintegerChecker<uint32_t> ())
154 .AddAttribute (
"FrameSize",
155 "Size of data frames in bytes.",
158 MakeUintegerChecker<uint32_t> ())
159 .AddTraceSource (
"RX",
160 "A packet was destined for and received at this MAC layer.",
162 "ns3::UanMac::PacketModeTracedCallback")
163 .AddTraceSource (
"Cycle",
164 "Trace cycle statistics.",
166 "ns3::UanMacRcGw::CycleCallback")
178 NS_LOG_WARN (
"RCMAC Gateway transmission to acoustic nodes is not yet implemented");
277 NS_FATAL_ERROR (
"Received CTS at GW. Currently only support single GW network!");
280 NS_FATAL_ERROR (
"Received ACK at GW. Currently only support single GW network!");
290 uint32_t numRts =
static_cast<uint32_t
> (
m_sortedRes.size ());
302 uint32_t totalBytes = 0;
303 uint32_t totalFrames = 0;
307 std::map<Mac8Address, Request>::iterator rit =
m_requests.begin ();
310 totalBytes += (*rit).second.length;
311 totalFrames += (*rit).second.numFrames;
313 pDelay = 2 *
m_sortedRes.begin ()->first.GetSeconds ();
328 double temprate = (thCtlRate - minRate) / ((
double)
m_rateStep) + 0.5;
335 NS_LOG_DEBUG (
"Found theoretical alpha: " << thAlpha <<
" Found associated rate = " << thCtlRate <<
" Giving rate number: " << temprate);
343 NS_LOG_WARN (
"Gateway found optimum RTS retry rate is below minimum");
356 double winSize = (double)(totalBytes) * 8.0 / dataRate +
m_sifs.
GetSeconds () * totalFrames + pDelay;
395 std::set<std::pair<Time, Mac8Address> >::iterator it =
m_sortedRes.begin ();
396 Time minPdelay = (*it).first;
402 Time pdelay = (*it).first;
408 m_ackData.insert (std::make_pair (dest, newData));
410 Time earliestArr = ctsTxTimeTotal + pdelay + pdelay +
m_sifs;
411 Time arrivalTime =
std::max (earliestArr, nextEarliest);
417 ctsh.SetRtsTimeStamp (req.
rxTime);
420 ctsh.SetDelayToTx (arrivalTime);
424 " GW Scheduling reception for " << (uint32_t) req.
numFrames <<
425 " frames at " << (
Simulator::Now () + arrivalTime).GetSeconds () <<
" (delaytiltx of " << arrivalTime.
GetSeconds () <<
") Total length is " << req.
length <<
" with txtime " << req.
length * 8 / dataRate <<
" seconds");
464 std::map<Mac8Address, AckData>::iterator it =
m_ackData.begin ();
470 std::list<uint32_t> toNack;
471 for (uint8_t i = 0; i < data.
expFrames; i++)
475 toNack.push_back (i);
484 std::list<uint32_t>::iterator nit = toNack.begin ();
485 for (; nit != toNack.end (); nit++)
494 nextAck = nextAck + ackTime +
m_sifs;
528 m_phy->SendPacket (pkt, rate);
537 double lrae =
m_rtsSize * 8.0 * a * std::exp (1.0);
538 if (totalFrames == 0)
554 if (alpha < 0 || alpha > 1)
559 NS_ASSERT_MSG (alpha > 0 && alpha < 1,
"Error computing alpha. Alpha out of valid range!");
567 std::vector<double> pds;
568 std::map<Mac8Address, Time>::iterator pdit =
m_propDelay.begin ();
572 pds.push_back (pdit->second.GetSeconds ());
579 std::sort (pds.begin (), pds.end ());
581 std::vector<double> exppdk;
583 for (uint32_t k = 1; k <= n; k++)
586 exppdk.push_back (pds[ind]);
598 double expk = n * (1 - std::exp (-((
double) a) / (
double) n));
602 double expdata = 8 * ld * expk;
609 for (uint32_t i = 1; i <= n; i++)
615 double s = (1.0 /
m_totalRate) * expdata / exptime;
630 for (uint32_t i = 1; i <= n - k + 1; i++)
632 double nChK =
static_cast<double> (
NchooseK (n, k));
633 double p = (nChK > 0) ? (static_cast<double> (
NchooseK (n - i, k - 1)) / nChK) : DBL_MAX;
636 return (uint32_t)(sum + 0.5);
642 double nck = (double)
NchooseK (n, k);
643 return nck * std::pow ( (std::exp ( (
double) a / (
double) n) - 1.0), (
double) k) * std::exp (-( (
double) a));
652 for (uint32_t k = 1; k <= n; k++)
657 double term = pik * num / denom;
679 for (uint32_t i = 1; i <= k; i++)
681 accum = accum * (n - k + i) / i;
684 return (uint64_t)(accum + 0.5);
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
double m_retryStep
Retry rate increment.
Simulation virtual time values and global simulation resolution.
virtual void AttachPhy(Ptr< UanPhy > phy)
Attach PHY layer to this MAC.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
Time rxTime
Time request received.
uint32_t CompExpMinIndex(uint32_t n, uint32_t k)
Index to the k'th expected delay among n nodes.
TracedCallback< Time, Time, uint32_t, uint32_t, double, uint32_t, double > m_cycleLogger
A packet was destined for and received at this MAC layer.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
uint32_t m_ctsSizeG
Size of UanHeaderCommon and UanHeaderRcCtsGlobal.
bool m_cleared
Flag when we've been cleared.
std::map< Mac8Address, Request > m_requests
Request for each node.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
std::set< std::pair< Time, Mac8Address > > m_sortedRes
Queued request times.
uint32_t m_numRates
Number of rates per Phy layer.
std::map< Mac8Address, Time > m_propDelay
Propagation delay to each node.
Time m_sifs
Spacing between frames to account for timing error and processing delay.
Channel is IDLE, no packet is being transmitted.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
#define NS_UNUSED(x)
Mark a local variable as unused.
uint16_t m_currentRetryRate
Retry rate number for current cycle.
static Mac8Address GetBroadcast(void)
Get the broadcast address (255).
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
double m_minRetryRate
Smallest allowed RTS retry rate.
virtual void DoDispose(void)
Destructor implementation.
virtual void Clear(void)
Clears all pointer references.
State m_state
Gateway processing state.
virtual ~UanMacRcGw()
Dummy destructor, see DoDispose.
a polymophic address class
uint8_t numFrames
Number of frames.
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.
std::vector< double > GetExpPdk(void)
Get the expected propagation delay to each node.
void ReceiveError(Ptr< Packet > pkt, double sinr)
PHY receive error callback.
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Time m_maxDelta
Maximum propagation delay between gateway and non-gateway nodes .
double ComputeExpS(uint32_t a, uint32_t ld, std::vector< double > exppdk)
Throughput for a reservations with framesize ld, given expected delays exppdk.
std::map< Mac8Address, AckData > m_ackData
AckData for each node.
void SendPacket(Ptr< Packet > pkt, uint32_t rate)
Send packet on PHY.
NS_ASSERT_MSG(false,"Ipv4AddressGenerator::MaskToIndex(): Impossible")
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.
uint64_t NchooseK(uint32_t n, uint32_t k)
Binomial coefficient.
virtual bool Enqueue(Ptr< Packet > pkt, uint16_t protocolNumber, const Address &dest)
Enqueue packet to be transmitted.
AttributeValue implementation for Time.
Hold an unsigned integer type.
uint32_t m_numNodes
Number of non-gateway nodes in this gateway's neighborhood.
Abstraction of packet modulation information.
void ReceivePacket(Ptr< Packet > pkt, double sinr, UanTxMode mode)
PHY recieve ok callback.
A class used for addressing MAC8 MAC's.
uint8_t frameNo
Current frame number.
virtual void DoDispose()
Destructor implementation.
uint32_t m_rateStep
Increments available for rate assignment in bps.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
uint16_t length
Request header length.
TracedCallback< Ptr< const Packet >, UanTxMode > m_rxLogger
A packet was destined for and received at this MAC layer.
uint32_t m_currentRateNum
Rate number corresponding to data rate of current cycle.
uint32_t FindOptA(void)
Compute the optimum maximum number of reservations to accept per cycle.
uint8_t expFrames
Expected number of frames.
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
uint32_t m_ctsSizeN
Size of UanHeaderRcCts.
static TypeId GetTypeId(void)
Register this type.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
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.
uint8_t frameNo
Frame number being ACK'ed.
Ptr< UanPhy > m_phy
PHY layer attached to this MAC.
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
uint32_t m_frameSize
Size of data frames in bytes.
uint32_t m_totalRate
Total available channel rate in bps (for a single channel, without splitting reservation channel)...
Callback< void, Ptr< Packet >, uint16_t, const Mac8Address & > m_forwardUpCb
Forwarding up callback.
void StartCycle(void)
Cycle through pending requests.
Mac8Address m_address
The MAC address.
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
uint32_t m_maxRes
Maximum number of reservations to accept per cycle.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Time Seconds(double value)
Construct a Time in the indicated unit.
void CycleStarted(void)
Set state to INCYCLE.
double ComputePiK(uint32_t a, uint32_t n, uint32_t k)
Numeric function.
uint32_t m_rtsSize
Size of UanHeaderCommon and UanHeaderRcRts.
void EndCycle(void)
End cycle by scheduling pending ACKs.
uint8_t retryNo
Retry number.
virtual void SetForwardUpCb(Callback< void, Ptr< Packet >, uint16_t, const Mac8Address & > cb)
Set the callback to forward packets up to higher layers.
double ComputeAlpha(uint32_t totalFrames, uint32_t totalBytes, uint32_t n, uint32_t a, double deltaK)
Compute alpha parameter.
This class can be used to hold variables of floating point type such as 'double' or 'float'...
std::set< uint8_t > rxFrames
Received frames.
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
a unique identifier for an interface.
uint32_t m_ackSize
Size of UanHeaderCommon and UanHeaderRcAck.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
double ComputeExpBOverA(uint32_t n, uint32_t a, uint32_t ldlh, std::vector< double > deltaK)
Numeric function.
void AddHeader(const Header &header)
Add header to this packet.