A Discrete-Event Network Simulator
API
uan-mac-rc-gw.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2009 University of Washington
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Leonard Tracy <lentracy@gmail.com>
19  */
20 
21 #include "uan-mac-rc-gw.h"
22 #include "uan-mac-rc.h"
23 #include "uan-header-common.h"
24 #include "uan-header-rc.h"
25 #include "uan-phy.h"
26 #include "uan-tx-mode.h"
27 
28 #include "ns3/assert.h"
29 #include "ns3/log.h"
30 #include "ns3/trace-source-accessor.h"
31 #include "ns3/nstime.h"
32 #include "ns3/double.h"
33 #include "ns3/uinteger.h"
34 
35 #include <cfloat>
36 #include <utility>
37 #include <set>
38 #include <map>
39 #include <vector>
40 #include <algorithm>
41 
42 namespace ns3 {
43 
44 NS_LOG_COMPONENT_DEFINE ("UanMacRcGw");
45 
46 NS_OBJECT_ENSURE_REGISTERED (UanMacRcGw);
47 
49  : UanMac (),
50  m_state (IDLE),
51  m_currentRateNum (0),
52  m_cleared (false)
53 {
54  UanHeaderCommon ch;
55  UanHeaderRcRts rts;
56  UanHeaderRcCts cts;
57  UanHeaderRcAck ack;
59 
64 
65  NS_LOG_DEBUG ("Gateway initialized");
66 }
67 
69 {
70 }
71 
72 void
74 {
75  if (m_cleared)
76  {
77  return;
78  }
79  m_cleared = true;
80  if (m_phy)
81  {
82  m_phy->Clear ();
83  m_phy = 0;
84  }
85  m_propDelay.clear ();
86  std::map<UanAddress, AckData>::iterator it = m_ackData.begin ();
87  for (; it != m_ackData.end (); it++)
88  {
89  it->second.rxFrames.clear ();
90  }
91  m_ackData.clear ();
92  m_requests.clear ();
93  m_sortedRes.clear ();
94 }
95 
96 void
98 {
99  Clear ();
101 }
102 TypeId
104 {
105  static TypeId tid = TypeId ("ns3::UanMacRcGw")
106  .SetParent<UanMac> ()
107  .SetGroupName ("Uan")
108  .AddConstructor<UanMacRcGw> ()
109  .AddAttribute ("MaxReservations",
110  "Maximum number of reservations to accept per cycle.",
111  UintegerValue (10),
113  MakeUintegerChecker<uint32_t> ())
114  .AddAttribute ("NumberOfRates",
115  "Number of rates per Phy layer.",
116  UintegerValue (1023),
118  MakeUintegerChecker<uint32_t> ())
119  .AddAttribute ("MaxPropDelay",
120  "Maximum propagation delay between gateway and non-gateway nodes.",
121  TimeValue (Seconds (2)),
123  MakeTimeChecker ())
124  .AddAttribute ("SIFS",
125  "Spacing between frames to account for timing error and processing delay.",
126  TimeValue (Seconds (0.2)),
128  MakeTimeChecker ())
129  .AddAttribute ("NumberOfNodes",
130  "Number of non-gateway nodes in this gateway's neighborhood.",
131  UintegerValue (10),
133  MakeUintegerChecker<uint32_t> ())
134  .AddAttribute ("MinRetryRate",
135  "Smallest allowed RTS retry rate.",
136  DoubleValue (0.01),
138  MakeDoubleChecker<double> ())
139  .AddAttribute ("RetryStep",
140  "Retry rate increment.",
141  DoubleValue (0.01),
143  MakeDoubleChecker<double> ())
144  .AddAttribute ("TotalRate",
145  "Total available channel rate in bps (for a single channel, without splitting reservation channel).",
146  UintegerValue (4096),
148  MakeUintegerChecker<uint32_t> ())
149  .AddAttribute ("RateStep",
150  "Increments available for rate assignment in bps.",
151  UintegerValue (4),
153  MakeUintegerChecker<uint32_t> ())
154  .AddAttribute ("FrameSize",
155  "Size of data frames in bytes.",
156  UintegerValue (1000),
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")
167 
168  ;
169 
170  return tid;
171 }
172 
173 Address
175 {
176  return m_address;
177 }
178 
179 void
181 {
182  m_address = addr;
183 }
184 
185 bool
186 UanMacRcGw::Enqueue (Ptr<Packet> packet, const Address &dest, uint16_t protocolNumber)
187 {
188  NS_LOG_WARN ("RCMAC Gateway transmission to acoustic nodes is not yet implemented");
189  return false;
190 }
191 
192 void
194 {
195  m_forwardUpCb = cb;
196 }
197 
198 void
200 {
201  m_phy = phy;
202  phy->SetReceiveOkCallback (MakeCallback (&UanMacRcGw::ReceivePacket, this));
203  phy->SetReceiveErrorCallback (MakeCallback (&UanMacRcGw::ReceiveError, this));
204 }
205 
206 void
208 {
209 }
210 
211 Address
213 {
214  return UanAddress::GetBroadcast ();
215 }
216 
217 void
219 {
220  UanHeaderCommon ch;
221  pkt->PeekHeader (ch);
222 
223  if (ch.GetDest () == m_address || ch.GetDest () == UanAddress::GetBroadcast ())
224  {
225  m_rxLogger (pkt, mode);
226  }
227  else
228  {
229  return;
230  }
231 
232  pkt->RemoveHeader (ch);
233 
234  switch (ch.GetType ())
235  {
236  case UanMacRc::TYPE_DATA:
237  {
238  UanHeaderRcData dh;
239  pkt->RemoveHeader (dh);
240  m_propDelay[ch.GetSrc ()] = dh.GetPropDelay ();
241  if (m_ackData.find (ch.GetSrc ()) == m_ackData.end ())
242  {
243  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " GATEWAY Received unexpected data packet");
244  }
245  else
246  {
247  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " GW Received data packet from " << ch.GetSrc () << " length = " << pkt->GetSize ());
248  m_ackData[ch.GetSrc ()].rxFrames.insert (dh.GetFrameNo ());
249  }
250  m_forwardUpCb (pkt, ch.GetSrc ());
251  }
252  break;
254  case UanMacRc::TYPE_RTS:
255  if (m_state == CTSING)
256  {
257  return;
258  }
259 
260  {
261  UanHeaderRcRts rh;
262  pkt->RemoveHeader (rh);
263 
264  if (m_requests.find (ch.GetSrc ()) == m_requests.end ())
265  {
266  Request req;
267  req.numFrames = rh.GetNoFrames ();
268  req.rxTime = Simulator::Now ();
269  req.frameNo = rh.GetFrameNo ();
270  req.retryNo = rh.GetRetryNo ();
271  req.length = rh.GetLength ();
272  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " GW storing reservation from " << ch.GetSrc () << " with length " << req.length);
273  m_requests.insert (std::make_pair (ch.GetSrc (), req));
274  std::map<UanAddress, Time>::iterator it = m_propDelay.find (ch.GetSrc ());
275  if (it == m_propDelay.end ())
276  {
277  m_sortedRes.insert (std::make_pair (m_maxDelta, ch.GetSrc ()));
278  }
279  else
280  {
281  m_sortedRes.insert (std::make_pair ( (*it).second, ch.GetSrc ()));
282  }
283  }
284  }
285  if (m_state == IDLE)
286  {
287  StartCycle ();
288  }
289  break;
290  case UanMacRc::TYPE_CTS:
291  NS_FATAL_ERROR ("Received CTS at GW. Currently only support single GW network!");
292  break;
293  case UanMacRc::TYPE_ACK:
294  NS_FATAL_ERROR ("Received ACK at GW. Currently only support single GW network!");
295  break;
296  default:
297  NS_FATAL_ERROR ("Received unknown packet at GW!");
298  }
299 }
300 
301 void
303 {
304  uint32_t numRts = m_sortedRes.size ();
305 
306  if (numRts)
307  {
308  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " Simulator starting non-empty cycle");
309  }
310  else
311  {
312  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " Simulator starting EMPTY cycle");
313  }
314 
315  // Calculate dataRate
316  uint32_t totalBytes = 0;
317  uint32_t totalFrames = 0;
318  double pDelay = 0;
319  if (numRts > 0)
320  {
321  std::map<UanAddress, Request>::iterator rit = m_requests.begin ();
322  for (; rit != m_requests.end (); rit++)
323  {
324  totalBytes += (*rit).second.length;
325  totalFrames += (*rit).second.numFrames;
326  }
327  pDelay = 2 * m_sortedRes.begin ()->first.GetSeconds ();
328  }
329 
330 
331  double minRate = m_phy->GetMode (m_numRates).GetDataRateBps ();
332 
333  uint32_t optA = m_maxRes;
334  if (m_maxRes == 0)
335  {
336  optA = FindOptA ();
337  }
338  double thAlpha = ComputeAlpha (totalFrames, totalBytes, m_numNodes, optA, pDelay / 2.0);
339 
340  double thCtlRate = m_totalRate * thAlpha;
341 
342  double temprate = (thCtlRate - minRate) / ((double) m_rateStep) + 0.5;
343  m_currentRateNum = (uint32_t) temprate;
345  {
347  }
348 
349  NS_LOG_DEBUG ("Found theoretical alpha: " << thAlpha << " Found associated rate = " << thCtlRate << " Giving rate number: " << temprate);
350  double thX = thAlpha * m_totalRate / (2.0 * m_numNodes * m_rtsSize * 8.0);
351 
352  double dataRate = m_phy->GetMode (m_currentRateNum).GetDataRateBps ();
353 
354 
355  if (thX < m_minRetryRate)
356  {
357  NS_LOG_WARN ("Gateway found optimum RTS retry rate is below minimum");
358  m_currentRetryRate = 0;
359  }
360  else
361  {
362  m_currentRetryRate = (uint16_t)((thX - m_minRetryRate) / m_retryStep + 0.5);
363  }
364 
365  double actualX = m_currentRetryRate * m_retryStep + m_minRetryRate;
366 
367  uint32_t ctlRate = m_phy->GetMode (m_currentRateNum + m_numRates).GetDataRateBps ();
368 
369 
370  double winSize = (double)(totalBytes) * 8.0 / dataRate + m_sifs.GetSeconds () * totalFrames + pDelay;
371  if (numRts == 0)
372  {
373  winSize = (optA * std::exp (1.0) + 0.5) * 2.0 * 8.0 * m_rtsSize / (thAlpha * m_totalRate) + 2 * m_maxDelta.GetSeconds ();
374  }
375  double effWinSize = winSize - m_rtsSize * 8 / ctlRate - 2 * m_maxDelta.GetSeconds ();
376 
377 
378  // Before fast CTS/ACK(below)
379  double cycleSeconds = winSize + (totalFrames + 1.0) * m_sifs.GetSeconds () + m_ctsSizeG * 8.0 / dataRate + (m_ctsSizeN + m_ackSize) * 8.0 * numRts / dataRate;
380 
381  Time ctsTxTimeG = Seconds (m_ctsSizeG * 8.0 / dataRate);
382  Time ctsTxTimeTotal = Seconds (m_ctsSizeN * 8.0 * numRts / dataRate) + ctsTxTimeG;
383  if (numRts == 0)
384  {
386  ctsg.SetWindowTime (Seconds (effWinSize));
389  ctsg.SetTxTimeStamp (Simulator::Now ());
390 
392  Ptr<Packet> p = Create<Packet> ();
393  p->AddHeader (ctsg);
394  p->AddHeader (ch);
396 
397 
398  Simulator::Schedule (Seconds (cycleSeconds), &UanMacRcGw::StartCycle, this);
399  m_state = INCYCLE;
400  m_cycleLogger (Simulator::Now (), Seconds (0), numRts, totalBytes, effWinSize, ctlRate, actualX);
401  return;
402  }
403 
404  Time nextEarliest = ctsTxTimeTotal + m_sifs;
405 
406  m_state = CTSING;
407  Simulator::Schedule (nextEarliest, &UanMacRcGw::CycleStarted, this);
408 
409  std::set<std::pair<Time, UanAddress> >::iterator it = m_sortedRes.begin ();
410  Time minPdelay = (*it).first;
411  Ptr<Packet> cts = Create<Packet> ();
412 
413  for (; it != m_sortedRes.end (); it++)
414  {
415  Request req = m_requests[(*it).second];
416  Time pdelay = (*it).first;
417 
418  AckData newData;
419  newData.expFrames = req.numFrames;
420  newData.frameNo = req.frameNo;
421  UanAddress dest = (*it).second;
422  m_ackData.insert (std::make_pair (dest, newData));
423 
424  Time earliestArr = ctsTxTimeTotal + pdelay + pdelay + m_sifs;
425  Time arrivalTime = std::max (earliestArr, nextEarliest);
426  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " GW: Scheduling request for prop. delay " << pdelay.GetSeconds () << " for " << (*it).second << " Earliest possible arrival=" << earliestArr.GetSeconds () << " Next arrival time=" << nextEarliest.GetSeconds ());
427  nextEarliest = arrivalTime + Seconds (req.length * 8.0 / dataRate) + Seconds (m_sifs.GetSeconds () * req.numFrames);
428 
429  UanHeaderRcCts ctsh;
430  ctsh.SetAddress (dest);
431  ctsh.SetRtsTimeStamp (req.rxTime);
432  ctsh.SetFrameNo (req.frameNo);
433  ctsh.SetRetryNo (req.retryNo);
434  ctsh.SetDelayToTx (arrivalTime);
435  cts->AddHeader (ctsh);
436 
437  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () <<
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");
440  }
441 
445  ctsg.SetWindowTime (Seconds (effWinSize));
446  ctsg.SetTxTimeStamp (Simulator::Now ());
447  UanHeaderCommon ch;
449  ch.SetSrc (m_address);
451  cts->AddHeader (ctsg);
452  cts->AddHeader (ch);
454 
455  m_requests.clear ();
456  m_sortedRes.clear ();
457  Simulator::Schedule (nextEarliest, &UanMacRcGw::EndCycle, this);
458 
459 
460  m_cycleLogger (Simulator::Now (), minPdelay, numRts, totalBytes, cycleSeconds, ctlRate, actualX);
461 }
462 
463 void
465 {
466  m_state = INCYCLE;
467 }
468 void
470 {
471 
472  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " GW Ending cycle");
473 
474  Time nextAck = Seconds (0);
475 
476  Time ackTime = Seconds (m_ackSize * 8.0 / m_phy->GetMode (m_currentRateNum).GetDataRateBps ());
477 
478  std::map<UanAddress, AckData>::iterator it = m_ackData.begin ();
479  for (; it != m_ackData.end (); it++)
480  {
481  UanAddress dest = (*it).first;
482  AckData &data = (*it).second;
483 
484  std::list<uint32_t> toNack;
485  for (uint32_t i = 0; i < data.expFrames; i++)
486  {
487  if (data.rxFrames.find (i) == data.rxFrames.end ())
488  {
489  toNack.push_back (i);
490  }
491  }
492  UanHeaderCommon ch;
493  ch.SetDest (dest);
494  ch.SetSrc (m_address);
496  UanHeaderRcAck ah;
497  ah.SetFrameNo (data.frameNo);
498  std::list<uint32_t>::iterator nit = toNack.begin ();
499  for (; nit != toNack.end (); nit++)
500  {
501  ah.AddNackedFrame (*nit);
502  }
503 
504  Ptr<Packet> ack = Create<Packet> ();
505  ack->AddHeader (ah);
506  ack->AddHeader (ch);
508  nextAck = nextAck + ackTime + m_sifs;
509  }
510  m_ackData.clear ();
512 
513 }
514 void
516 {
517  UanHeaderCommon ch;
518  pkt->PeekHeader (ch);
519  std::string type;
520  switch (ch.GetType ())
521  {
522  case UanMacRc::TYPE_DATA:
523  type = "DATA";
524  break;
525  case UanMacRc::TYPE_RTS:
526  type = "RTS";
527  break;
528  case UanMacRc::TYPE_CTS:
529  type = "CTS";
530  break;
531  case UanMacRc::TYPE_ACK:
532  type = "ACK";
533  break;
535  type = "GWPING";
536  break;
537  default:
538  type = "UNKNOWN";
539  break;
540  }
541  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " GW sending " << type << " packet with size " << pkt->GetSize () << " to " << ch.GetDest () << " at rate " << rate);
542  m_phy->SendPacket (pkt, rate);
543 }
544 
545 
546 double
547 UanMacRcGw::ComputeAlpha (uint32_t totalFrames, uint32_t totalBytes, uint32_t n, uint32_t a, double deltaK)
548 {
549 
550  double alpha;
551  double lrae = m_rtsSize * 8.0 * a * std::exp (1.0);
552  if (totalFrames == 0)
553  {
554 
555  alpha = (2.0 * lrae + 8.0 * m_rtsSize - std::sqrt (m_ctsSizeG * 8.0 * 8.0 * m_rtsSize + 2 * 8.0 * m_ctsSizeG * 8.0 * m_rtsSize * a * std::exp (1.0)) ) /
556  (2 * lrae + 8.0 * m_rtsSize - 8.0 * m_ctsSizeG);
557  }
558  else
559  {
560  double w = totalBytes * 8.0 + totalFrames*m_sifs.GetSeconds () * m_totalRate;
561  double v = m_rtsSize * 8.0 + 2 * lrae;
562  double u = (2 * m_maxDelta.GetSeconds () - 2 * deltaK) * m_totalRate;
563 
564  double gamma = (w - u + v) / (2 * (u - totalFrames * m_sifs.GetSeconds () * m_totalRate));
565 
566  alpha = -gamma + std::sqrt (gamma * gamma + v / (u - totalFrames * m_sifs.GetSeconds () * m_totalRate));
567 
568  if (alpha < 0 || alpha > 1)
569  {
570  alpha = -gamma - std::sqrt (gamma * gamma + v / (u - totalFrames * m_sifs.GetSeconds () * m_totalRate));
571  }
572  }
573  NS_ASSERT_MSG (alpha > 0 && alpha < 1, "Error computing alpha. Alpha out of valid range!");
574  return alpha;
575 }
576 
577 std::vector<double>
579 {
580  uint32_t n = m_numNodes;
581  std::vector<double> pds;
582  std::map<UanAddress, Time>::iterator pdit = m_propDelay.begin ();
583 
584  for (; pdit != m_propDelay.end (); pdit++)
585  {
586  pds.push_back (pdit->second.GetSeconds ());
587  }
588  while (pds.size () < m_numNodes)
589  {
590  pds.push_back (m_maxDelta.GetSeconds ());
591  }
592 
593  std::sort (pds.begin (), pds.end ());
594  // Find expected min. prop. delay for k nodes
595  std::vector<double> exppdk;
596  exppdk.push_back (m_maxDelta.GetSeconds ());
597  for (uint32_t k = 1; k <= n; k++)
598  {
599  uint32_t ind = CompExpMinIndex (n,k) - 1;
600  exppdk.push_back (pds[ind]);
601  }
602  return exppdk;
603 }
604 
605 double
606 UanMacRcGw::ComputeExpS (uint32_t a, uint32_t ld, std::vector<double> exppdk)
607 {
608  UanHeaderCommon ch;
609  uint32_t lh = ch.GetSerializedSize ();
610 
611  uint32_t n = m_numNodes;
612  double expk = n * (1 - std::exp (-((double) a) / (double) n));
613  NS_LOG_DEBUG ("expk = " << expk);
614 
615  // Compute expected data per cycle
616  double expdata = 8 * ld * expk;
617 
618  // Compute expected time per cycle
619  double alpha0 = ComputeAlpha (0,0,n,a,exppdk[0]);
620  double c0 = 8.0 * m_ctsSizeG / ( m_totalRate * (1 - alpha0)) + 2 * m_maxDelta.GetSeconds () + (a * std::exp (1.0) + 0.5) * 2 * m_rtsSize * 8.0 / (alpha0 * m_totalRate);
621  double exptime = ComputePiK (a,n,0) * c0;
622  double expp = 0;
623  for (uint32_t i = 1; i <= n; i++)
624  {
625  expp += ComputePiK (a,n,i) * exppdk[i - 1];
626  }
627 
628  exptime += ComputeExpBOverA (n,a,ld + lh,exppdk) + expk * 2 * m_sifs.GetSeconds () + m_sifs.GetSeconds () + 2 * expp;
629  double s = (1.0 / m_totalRate) * expdata / exptime;
630 
631  return s;
632 }
633 
634 double
635 UanMacRcGw::ComputeExpS (uint32_t a, uint32_t ld)
636 {
637  return ComputeExpS (a, ld, GetExpPdk ());
638 }
639 
640 uint32_t
641 UanMacRcGw::CompExpMinIndex (uint32_t n, uint32_t k)
642 {
643  double sum = 0;
644  for (uint32_t i = 1; i <= n - k + 1; i++)
645  {
646  double nChK = NchooseK (n, k);
647  double p = (nChK > 0) ? (NchooseK (n - i, k - 1) / nChK) : DBL_MAX;
648  sum += p * i;
649  }
650  return (uint32_t)(sum + 0.5);
651 }
652 
653 double
654 UanMacRcGw::ComputePiK (uint32_t a, uint32_t n, uint32_t k)
655 {
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));
658 }
659 
660 double
661 UanMacRcGw::ComputeExpBOverA (uint32_t n, uint32_t a, uint32_t ldlh, std::vector<double> deltaK)
662 {
663 
664  double sum = 0;
665  uint32_t lt = 8 * (m_ctsSizeN + ldlh + m_ackSize);
666  for (uint32_t k = 1; k <= n; k++)
667  {
668  double num = 8.0 * m_ctsSizeG + k * lt;
669  double denom = (1.0 - ComputeAlpha (k, k * ldlh, n, a, deltaK[k])) * m_totalRate;
670  double pik = ComputePiK (a, n, k);
671  double term = pik * num / denom;
672 
673  sum += term;
674  }
675 
676  return sum;
677 }
678 
679 uint64_t
680 UanMacRcGw::NchooseK (uint32_t n, uint32_t k)
681 {
682  if (k > n)
683  {
684  return 0;
685  }
686 
687  if (k > n / 2)
688  {
689  k = n - k;
690  }
691 
692  double accum = 1;
693  for (uint32_t i = 1; i <= k; i++)
694  {
695  accum = accum * (n - k + i) / i;
696  }
697 
698  return (uint64_t)(accum + 0.5);
699 
700 }
701 
702 uint32_t
704 {
705  double tput = 0;
706  uint32_t a = 1;
707  while (1)
708  {
709 
710  double newtput = ComputeExpS (a, m_frameSize);
711  if (newtput < tput)
712  {
713  a--;
714  break;
715  }
716  else
717  {
718  tput = newtput;
719  a++;
720  }
721  }
722  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " GW: Found optimum a = " << a);
723  return a;
724 }
725 
726 int64_t
728 {
729  NS_LOG_FUNCTION (this << stream);
730  return 0;
731 }
732 
733 } // namespace ns3
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.
Definition: packet.cc:267
Time GetPropDelay(void) const
Get the propagation delay found in handshaking.
double m_retryStep
Retry rate increment.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:102
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.
Cycle broadcast information.
void SetRateNum(uint16_t rate)
Set the rate number corresponding to data rate of current cycle.
uint32_t CompExpMinIndex(uint32_t n, uint32_t k)
Index to the k'th expected delay among n nodes.
virtual uint32_t GetSerializedSize(void) const
Callback template class.
Definition: callback.h:1176
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.
Definition: object-base.h:45
uint32_t m_ctsSizeG
Size of UanHeaderCommon and UanHeaderRcCtsGlobal.
Header used for ACK packets by protocol UanMacRc.
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...
void SetAddress(UanAddress addr)
Set the destination address, for scheduling info.
Gateway side of RC-MAC.
Definition: uan-mac-rc-gw.h:57
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.
Definition: csma-channel.h:75
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:201
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).
Definition: packet.h:796
uint16_t m_currentRetryRate
Retry rate number for current cycle.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:162
double m_minRetryRate
Smallest allowed RTS retry rate.
virtual void DoDispose(void)
Destructor implementation.
Definition: object.cc:346
Initial idle state.
Definition: uan-mac-rc-gw.h:99
virtual void Clear(void)
Clears all pointer references.
virtual Address GetBroadcast(void) const
Get the broadcast address.
State m_state
Gateway processing state.
uint8_t GetType(void) const
Get the header type value.
void SetWindowTime(Time t)
Set the window time (time duration following blocking time to allow RTS transmissions).
Callback< void, Ptr< Packet >, const UanAddress & > m_forwardUpCb
Forwarding up callback.
virtual ~UanMacRcGw()
Dummy destructor, see DoDispose.
uint8_t GetFrameNo(void) const
Get the frame number.
a polymophic address class
Definition: address.h:90
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.
Definition: time.cc:446
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.
Definition: nstime.h:341
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.
Definition: uan-mac.h:48
virtual Address GetAddress(void)
Get the MAC Address.
tuple phy
Definition: third.py:86
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay.
Definition: simulator.h:1375
#define max(a, b)
Definition: 80211b.c:45
uint64_t NchooseK(uint32_t n, uint32_t k)
Binomial coefficient.
AttributeValue implementation for Time.
Definition: nstime.h:1055
A class used for addressing UAN MAC's.
Definition: uan-address.h:40
virtual uint32_t GetSerializedSize(void) const
Hold an unsigned integer type.
Definition: uinteger.h:44
void SetSrc(UanAddress src)
Set the source address.
uint8_t data[writeSize]
uint32_t m_numNodes
Number of non-gateway nodes in this gateway's neighborhood.
Abstraction of packet modulation information.
Definition: uan-tx-mode.h:41
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)
Definition: callback.h:1489
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.
void SetDest(UanAddress dest)
Set the destination address.
void AddNackedFrame(uint8_t frame)
NACK a frame.
uint8_t GetRetryNo(void) const
Get the retry number of this RTS packet.
static UanAddress GetBroadcast(void)
Get the broadcast address (255).
Definition: uan-address.cc:92
uint32_t FindOptA(void)
Compute the optimum maximum number of reservations to accept per cycle.
uint8_t expFrames
Expected number of frames.
uint8_t GetFrameNo(void) const
Get the frame number of the reservation being transmitted.
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
Definition: packet.cc:277
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.
Common packet header fields.
UanAddress GetDest(void) const
Get the destination address.
Cycling through nodes.
Reservation request.
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: nstime.h:1056
static Time Now(void)
Return the current simulation virtual time.
Definition: simulator.cc:249
void SetTxTimeStamp(Time timeStamp)
Set the CTS timestamp.
uint8_t frameNo
Frame number being ACK'ed.
std::map< UanAddress, Request > m_requests
Request for each node.
uint8_t GetNoFrames(void) const
Get the number of data frames in the reservation.
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...
Definition: assert.h:90
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: double.h:42
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.
UanMacRcGw()
Constructor.
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
Definition: log.h:261
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.
Definition: log.h:269
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:993
void SetFrameNo(uint8_t frameNo)
Set the frame number of the reservation being acknowledged.
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.
virtual uint32_t GetSerializedSize(void) const
void SetType(uint8_t type)
Set the header type.
void EndCycle(void)
End cycle by scheduling pending ACKs.
UanAddress GetSrc(void) const
Get the source address.
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.
void SetRetryRate(uint16_t rate)
Set the retry rate number for the current cycle.
This class can be used to hold variables of floating point type such as 'double' or 'float'...
Definition: double.h:41
virtual uint32_t GetSerializedSize(void) const
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...
Definition: uinteger.h:45
Packet ACK data.
a unique identifier for an interface.
Definition: type-id.h:58
uint32_t m_ackSize
Size of UanHeaderCommon and UanHeaderRcAck.
virtual uint32_t GetSerializedSize(void) const
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:914
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.
Definition: packet.cc:256
Extra data header information.
Definition: uan-header-rc.h:41
uint16_t GetLength(void) const
Get the total number of bytes in the reservation, including headers.
virtual void SetForwardUpCb(Callback< void, Ptr< Packet >, const UanAddress & > cb)
Set the callback to forward packets up to higher layers.