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<UanAddress, 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")
 
  188   NS_LOG_WARN (
"RCMAC Gateway transmission to acoustic nodes is not yet implemented");
 
  291       NS_FATAL_ERROR (
"Received CTS at GW.  Currently only support single GW network!");
 
  294       NS_FATAL_ERROR (
"Received ACK at GW.  Currently only support single GW network!");
 
  316   uint32_t totalBytes = 0;
 
  317   uint32_t totalFrames = 0;
 
  321       std::map<UanAddress, Request>::iterator rit = 
m_requests.begin ();
 
  324           totalBytes += (*rit).second.length;
 
  325           totalFrames += (*rit).second.numFrames;
 
  327       pDelay = 2 * 
m_sortedRes.begin ()->first.GetSeconds ();
 
  342   double temprate = (thCtlRate - minRate) / ((
double) 
m_rateStep) + 0.5;
 
  349   NS_LOG_DEBUG (
"Found theoretical alpha: " << thAlpha << 
" Found associated rate = " << thCtlRate << 
" Giving rate number: " << temprate);
 
  357       NS_LOG_WARN (
"Gateway found optimum RTS retry rate is below minimum");
 
  370   double winSize = (double)(totalBytes) * 8.0 / dataRate + 
m_sifs.
GetSeconds () * totalFrames + pDelay;
 
  409   std::set<std::pair<Time, UanAddress> >::iterator it = 
m_sortedRes.begin ();
 
  410   Time minPdelay = (*it).first;
 
  416       Time pdelay = (*it).first;
 
  422       m_ackData.insert (std::make_pair (dest, newData));
 
  424       Time earliestArr = ctsTxTimeTotal + pdelay + pdelay + 
m_sifs;
 
  425       Time arrivalTime = std::max (earliestArr, nextEarliest);
 
  431       ctsh.SetRtsTimeStamp (req.
rxTime);
 
  434       ctsh.SetDelayToTx (arrivalTime);
 
  438                     " GW Scheduling reception for " << (uint32_t) req.
numFrames <<
 
  439                     " frames at " << (
Simulator::Now () + arrivalTime).GetSeconds () << 
"  (delaytiltx of " << arrivalTime.
GetSeconds () << 
")  Total length is " << req.
length << 
" with txtime " << req.
length * 8 / dataRate << 
" seconds");
 
  478   std::map<UanAddress, AckData>::iterator it = 
m_ackData.begin ();
 
  484       std::list<uint32_t> toNack;
 
  485       for (uint32_t i = 0; i < data.
expFrames; i++)
 
  489               toNack.push_back (i);
 
  498       std::list<uint32_t>::iterator nit = toNack.begin ();
 
  499       for (; nit != toNack.end (); nit++)
 
  508       nextAck = nextAck + ackTime + 
m_sifs;
 
  542   m_phy->SendPacket (pkt, rate);
 
  551   double lrae = 
m_rtsSize * 8.0 * a * std::exp (1.0);
 
  552   if (totalFrames == 0)
 
  568       if (alpha < 0 || alpha > 1)
 
  573   NS_ASSERT_MSG (alpha > 0 && alpha < 1, 
"Error computing alpha.  Alpha out of valid range!");
 
  581   std::vector<double> pds;
 
  582   std::map<UanAddress, Time>::iterator pdit = 
m_propDelay.begin ();
 
  586       pds.push_back (pdit->second.GetSeconds ());
 
  593   std::sort (pds.begin (), pds.end ());
 
  595   std::vector<double> exppdk;
 
  597   for (uint32_t k = 1; k <= n; k++)
 
  600       exppdk.push_back (pds[ind]);
 
  612   double expk = n * (1 - std::exp (-((
double) a) / (
double) n));
 
  616   double expdata = 8 * ld * expk;
 
  623   for (uint32_t i = 1; i <= n; i++)
 
  629   double s = (1.0 / 
m_totalRate) * expdata / exptime;
 
  644   for (uint32_t i = 1; i <= n - k + 1; i++)
 
  647       double p = (nChK > 0) ? (
NchooseK (n - i, k - 1) / nChK) : DBL_MAX;
 
  650   return (uint32_t)(sum + 0.5);
 
  656   double nck = (double) 
NchooseK (n, k);
 
  657   return nck * std::pow ( (std::exp ( (
double) a / (
double) n) - 1.0), (
double) k) * std::exp (-( (
double) a));
 
  666   for (uint32_t k = 1; k <= n; k++)
 
  671       double term = pik * num / denom;
 
  693   for (uint32_t i = 1; i <= k; i++)
 
  695       accum = accum * (n - k + i) / i;
 
  698   return (uint64_t)(accum + 0.5);
 
std::set< std::pair< Time, UanAddress > > m_sortedRes
Queued request times. 
 
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. 
 
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
 
uint32_t m_numRates
Number of rates per Phy layer. 
 
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. 
 
std::map< UanAddress, Time > m_propDelay
Propagation delay to each node. 
 
uint32_t GetSize(void) const 
Returns the the size in bytes of the packet (including the zero-filled initial payload). 
 
uint16_t m_currentRetryRate
Retry rate number for current cycle. 
 
#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. 
 
virtual Address GetBroadcast(void) const 
Get the broadcast address. 
 
State m_state
Gateway processing state. 
 
Callback< void, Ptr< Packet >, const UanAddress & > m_forwardUpCb
Forwarding up callback. 
 
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. 
 
void SendPacket(Ptr< Packet > pkt, uint32_t rate)
Send packet on PHY. 
 
Virtual base class for all UAN MAC protocols. 
 
virtual Address GetAddress(void)
Get the MAC Address. 
 
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. 
 
AttributeValue implementation for Time. 
 
A class used for addressing UAN MAC's. 
 
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. 
 
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)
 
virtual void SetAddress(UanAddress addr)
Set the address. 
 
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. 
 
static UanAddress GetBroadcast(void)
Get the broadcast address (255). 
 
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. 
 
std::map< UanAddress, Request > m_requests
Request for each node. 
 
Ptr< UanPhy > m_phy
PHY layer attached to this MAC. 
 
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
 
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)...
 
void StartCycle(void)
Cycle through pending requests. 
 
#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. 
 
std::map< UanAddress, AckData > m_ackData
AckData for each node. 
 
UanAddress m_address
The MAC address. 
 
uint8_t retryNo
Retry number. 
 
virtual bool Enqueue(Ptr< Packet > pkt, const Address &dest, uint16_t protocolNumber)
Enqueue packet to be transmitted. 
 
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. 
 
virtual void SetForwardUpCb(Callback< void, Ptr< Packet >, const UanAddress & > cb)
Set the callback to forward packets up to higher layers.