A Discrete-Event Network Simulator
API
uan-phy-dual.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2009 University of Washington
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation;
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16  *
17  * Author: Leonard Tracy <lentracy@gmail.com>
18  * Andrea Sacco <andrea.sacco85@gmail.com>
19  */
20 
21 #include "uan-phy-dual.h"
22 
23 #include "uan-channel.h"
24 #include "uan-header-common.h"
25 #include "uan-mac-rc.h"
26 #include "uan-net-device.h"
27 #include "uan-phy-gen.h"
28 #include "uan-phy.h"
29 #include "uan-tx-mode.h"
30 
31 #include "ns3/double.h"
32 #include "ns3/log.h"
33 #include "ns3/ptr.h"
34 #include "ns3/simulator.h"
35 #include "ns3/string.h"
36 #include "ns3/trace-source-accessor.h"
37 #include "ns3/traced-callback.h"
38 
39 #include <cmath>
40 
41 namespace ns3
42 {
43 
44 NS_LOG_COMPONENT_DEFINE("UanPhyDual");
45 
46 NS_OBJECT_ENSURE_REGISTERED(UanPhyDual);
47 NS_OBJECT_ENSURE_REGISTERED(UanPhyCalcSinrDual);
48 
50 {
51 }
52 
54 {
55 }
56 
57 TypeId
59 {
60  static TypeId tid = TypeId("ns3::UanPhyCalcSinrDual")
62  .SetGroupName("Uan")
63  .AddConstructor<UanPhyCalcSinrDual>();
64  return tid;
65 }
66 
67 double
69  Time arrTime,
70  double rxPowerDb,
71  double ambNoiseDb,
72  UanTxMode mode,
73  UanPdp pdp,
74  const UanTransducer::ArrivalList& arrivalList) const
75 {
76  if (mode.GetModType() != UanTxMode::OTHER)
77  {
78  NS_LOG_WARN("Calculating SINR for unsupported modulation type");
79  }
80 
81  double intKp = -DbToKp(rxPowerDb); // This packet is in the arrivalList
82  auto it = arrivalList.begin();
83  for (; it != arrivalList.end(); it++)
84  {
85  // Only count interference if there is overlap in incoming frequency
86  if (std::abs((double)it->GetTxMode().GetCenterFreqHz() - (double)mode.GetCenterFreqHz()) <
87  (double)(it->GetTxMode().GetBandwidthHz() / 2 + mode.GetBandwidthHz() / 2) - 0.5)
88  {
89  UanHeaderCommon ch;
90  UanHeaderCommon ch2;
91  if (pkt)
92  {
93  pkt->PeekHeader(ch);
94  }
95  it->GetPacket()->PeekHeader(ch2);
96 
97  if (pkt)
98  {
99  if (ch.GetType() == UanMacRc::TYPE_DATA)
100  {
101  NS_LOG_DEBUG("Adding interferer from "
102  << ch2.GetSrc() << " against " << ch.GetSrc()
103  << ": PktRxMode: " << mode.GetName()
104  << " Int mode: " << it->GetTxMode().GetName() << " Separation: "
105  << std::abs((double)it->GetTxMode().GetCenterFreqHz() -
106  (double)mode.GetCenterFreqHz())
107  << " Combined bandwidths: "
108  << (double)(it->GetTxMode().GetBandwidthHz() / 2 +
109  mode.GetBandwidthHz() / 2) -
110  0.5);
111  }
112  }
113  intKp += DbToKp(it->GetRxPowerDb());
114  }
115  }
116 
117  double totalIntDb = KpToDb(intKp + DbToKp(ambNoiseDb));
118 
119  NS_LOG_DEBUG(Now().As(Time::S) << " Calculating SINR: RxPower = " << rxPowerDb
120  << " dB. Number of interferers = " << arrivalList.size()
121  << " Interference + noise power = " << totalIntDb
122  << " dB. SINR = " << rxPowerDb - totalIntDb << " dB.");
123  return rxPowerDb - totalIntDb;
124 }
125 
127  : UanPhy()
128 {
129  m_phy1 = CreateObject<UanPhyGen>();
130  m_phy2 = CreateObject<UanPhyGen>();
131 
132  m_phy1->SetReceiveOkCallback(m_recOkCb);
133  m_phy2->SetReceiveOkCallback(m_recOkCb);
134 
135  m_phy1->SetReceiveErrorCallback(m_recErrCb);
136  m_phy2->SetReceiveErrorCallback(m_recErrCb);
137 }
138 
140 {
141 }
142 
143 void
145 {
146  if (m_phy1)
147  {
148  m_phy1->Clear();
149  m_phy1 = nullptr;
150  }
151  if (m_phy2)
152  {
153  m_phy2->Clear();
154  m_phy2 = nullptr;
155  }
156 }
157 
158 void
160 {
161  Clear();
163 }
164 
165 TypeId
167 {
168  static TypeId tid =
169  TypeId("ns3::UanPhyDual")
170  .SetParent<UanPhy>()
171  .SetGroupName("Uan")
172  .AddConstructor<UanPhyDual>()
173  .AddAttribute(
174  "CcaThresholdPhy1",
175  "Aggregate energy of incoming signals to move to CCA Busy state dB of Phy1.",
176  DoubleValue(10),
179  MakeDoubleChecker<double>())
180  .AddAttribute(
181  "CcaThresholdPhy2",
182  "Aggregate energy of incoming signals to move to CCA Busy state dB of Phy2.",
183  DoubleValue(10),
186  MakeDoubleChecker<double>())
187  .AddAttribute(
188  "TxPowerPhy1",
189  "Transmission output power in dB of Phy1.",
190  DoubleValue(190),
192  MakeDoubleChecker<double>())
193  .AddAttribute(
194  "TxPowerPhy2",
195  "Transmission output power in dB of Phy2.",
196  DoubleValue(190),
198  MakeDoubleChecker<double>())
199  .AddAttribute(
200  "SupportedModesPhy1",
201  "List of modes supported by Phy1.",
202  UanModesListValue(UanPhyGen::GetDefaultModes()),
203  MakeUanModesListAccessor(&UanPhyDual::GetModesPhy1, &UanPhyDual::SetModesPhy1),
204  MakeUanModesListChecker())
205  .AddAttribute(
206  "SupportedModesPhy2",
207  "List of modes supported by Phy2.",
208  UanModesListValue(UanPhyGen::GetDefaultModes()),
209  MakeUanModesListAccessor(&UanPhyDual::GetModesPhy2, &UanPhyDual::SetModesPhy2),
210  MakeUanModesListChecker())
211  .AddAttribute(
212  "PerModelPhy1",
213  "Functor to calculate PER based on SINR and TxMode for Phy1.",
214  StringValue("ns3::UanPhyPerGenDefault"),
216  MakePointerChecker<UanPhyPer>())
217  .AddAttribute(
218  "PerModelPhy2",
219  "Functor to calculate PER based on SINR and TxMode for Phy2.",
220  StringValue("ns3::UanPhyPerGenDefault"),
222  MakePointerChecker<UanPhyPer>())
223  .AddAttribute(
224  "SinrModelPhy1",
225  "Functor to calculate SINR based on pkt arrivals and modes for Phy1.",
226  StringValue("ns3::UanPhyCalcSinrDual"),
228  MakePointerChecker<UanPhyCalcSinr>())
229  .AddAttribute(
230  "SinrModelPhy2",
231  "Functor to calculate SINR based on pkt arrivals and modes for Phy2.",
232  StringValue("ns3::UanPhyCalcSinrDual"),
234  MakePointerChecker<UanPhyCalcSinr>())
235  .AddTraceSource("RxOk",
236  "A packet was received successfully.",
238  "ns3::UanPhy::TracedCallback")
239  .AddTraceSource("RxError",
240  "A packet was received unsuccessfuly.",
242  "ns3::UanPhy::TracedCallback")
243  .AddTraceSource("Tx",
244  "Packet transmission beginning.",
246  "ns3::UanPhy::TracedCallback")
247 
248  ;
249 
250  return tid;
251 }
252 
253 void
255 {
256  NS_LOG_DEBUG("Not Implemented");
257 }
258 
259 void
261 {
262  NS_LOG_DEBUG("Not Implemented");
263 }
264 
265 void
267 {
268  NS_LOG_DEBUG("Not Implemented");
269 }
270 
271 void
272 UanPhyDual::SendPacket(Ptr<Packet> pkt, uint32_t modeNum)
273 {
274  if (modeNum <= m_phy1->GetNModes() - 1)
275  {
276  NS_LOG_DEBUG(Now().As(Time::S) << " Sending packet on Phy1 with mode number " << modeNum);
277  m_txLogger(pkt, m_phy1->GetTxPowerDb(), m_phy1->GetMode(modeNum));
278  m_phy1->SendPacket(pkt, modeNum);
279  }
280  else
281  {
282  NS_LOG_DEBUG(Now().As(Time::S) << " Sending packet on Phy2 with mode number "
283  << modeNum - m_phy1->GetNModes());
284  m_txLogger(pkt, m_phy2->GetTxPowerDb(), m_phy2->GetMode(modeNum - m_phy1->GetNModes()));
285  m_phy2->SendPacket(pkt, modeNum - m_phy1->GetNModes());
286  }
287 }
288 
289 void
291 {
292  m_phy1->RegisterListener(listener);
293  m_phy2->RegisterListener(listener);
294 }
295 
296 void
298  double /* rxPowerDb */,
299  UanTxMode /* txMode */,
300  UanPdp /* pdp */)
301 {
302  // Not called. StartRxPacket in m_phy1 and m_phy2 are called directly from Transducer.
303 }
304 
305 void
307 {
308  m_phy1->SetReceiveOkCallback(cb);
309  m_phy2->SetReceiveOkCallback(cb);
310 }
311 
312 void
314 {
315  m_phy1->SetReceiveErrorCallback(cb);
316  m_phy2->SetReceiveErrorCallback(cb);
317 }
318 
319 void
321 {
322  m_phy1->SetTxPowerDb(txpwr);
323  m_phy2->SetTxPowerDb(txpwr);
324 }
325 
326 void
328 {
329  m_phy1->SetTxPowerDb(txpwr);
330 }
331 
332 void
334 {
335  m_phy2->SetTxPowerDb(txpwr);
336 }
337 
338 void
340 {
341  m_phy1->SetRxThresholdDb(thresh);
342  m_phy2->SetRxThresholdDb(thresh);
343 }
344 
345 void
347 {
348  m_phy1->SetCcaThresholdDb(thresh);
349  m_phy2->SetCcaThresholdDb(thresh);
350 }
351 
352 void
354 {
355  m_phy1->SetCcaThresholdDb(thresh);
356 }
357 
358 void
360 {
361  m_phy2->SetCcaThresholdDb(thresh);
362 }
363 
364 double
366 {
367  NS_LOG_WARN("Warning: Dual Phy only returns TxPowerDb of Phy 1");
368  return m_phy1->GetTxPowerDb();
369 }
370 
371 double
373 {
374  return m_phy1->GetTxPowerDb();
375 }
376 
377 double
379 {
380  return m_phy2->GetTxPowerDb();
381 }
382 
383 double
385 {
386  return m_phy1->GetRxThresholdDb();
387 }
388 
389 double
391 {
392  NS_LOG_WARN("Dual Phy only returns CCAThreshold of Phy 1");
393  return m_phy1->GetCcaThresholdDb();
394 }
395 
396 double
398 {
399  return m_phy1->GetCcaThresholdDb();
400 }
401 
402 double
404 {
405  return m_phy2->GetCcaThresholdDb();
406 }
407 
408 bool
410 {
411  return m_phy1->IsStateIdle();
412 }
413 
414 bool
416 {
417  return m_phy2->IsStateIdle();
418 }
419 
420 bool
422 {
423  return m_phy1->IsStateRx();
424 }
425 
426 bool
428 {
429  return m_phy2->IsStateRx();
430 }
431 
432 bool
434 {
435  return m_phy1->IsStateTx();
436 }
437 
440 {
441  return m_phy1->GetPacketRx();
442 }
443 
446 {
447  return m_phy2->GetPacketRx();
448 }
449 
450 bool
452 {
453  return m_phy2->IsStateTx();
454 }
455 
456 bool
458 {
459  return m_phy1->IsStateSleep() && m_phy2->IsStateSleep();
460 }
461 
462 bool
464 {
465  return m_phy1->IsStateIdle() && m_phy2->IsStateIdle();
466 }
467 
468 bool
470 {
471  return !IsStateIdle() || !IsStateSleep();
472 }
473 
474 bool
476 {
477  return m_phy1->IsStateRx() || m_phy2->IsStateRx();
478 }
479 
480 bool
482 {
483  return m_phy1->IsStateTx() || m_phy2->IsStateTx();
484 }
485 
486 bool
488 {
489  return m_phy1->IsStateCcaBusy() || m_phy2->IsStateCcaBusy();
490 }
491 
494 {
495  return m_phy1->GetChannel();
496 }
497 
500 {
501  return m_phy1->GetDevice();
502 }
503 
504 void
506 {
507  m_phy1->SetChannel(channel);
508  m_phy2->SetChannel(channel);
509 }
510 
511 void
513 {
514  m_phy1->SetDevice(device);
515  m_phy2->SetDevice(device);
516 }
517 
518 void
520 {
521  m_phy1->SetMac(mac);
522  m_phy2->SetMac(mac);
523 }
524 
525 void
527  double /* txPowerDb */,
528  UanTxMode /* txMode */)
529 {
530 }
531 
532 void
534 {
535  m_phy1->NotifyIntChange();
536  m_phy2->NotifyIntChange();
537 }
538 
539 void
541 {
542  m_phy1->SetTransducer(trans);
543  m_phy2->SetTransducer(trans);
544 }
545 
548 {
549  NS_LOG_WARN("DualPhy Returning transducer of Phy1");
550  return m_phy1->GetTransducer();
551 }
552 
553 uint32_t
555 {
556  return m_phy1->GetNModes() + m_phy2->GetNModes();
557 }
558 
559 UanTxMode
561 {
562  if (n < m_phy1->GetNModes())
563  {
564  return m_phy1->GetMode(n);
565  }
566  else
567  {
568  return m_phy2->GetMode(n - m_phy1->GetNModes());
569  }
570 }
571 
574 {
575  UanModesListValue modeValue;
576  m_phy1->GetAttribute("SupportedModes", modeValue);
577  return modeValue.Get();
578 }
579 
582 {
583  UanModesListValue modeValue;
584  m_phy2->GetAttribute("SupportedModes", modeValue);
585  return modeValue.Get();
586 }
587 
588 void
590 {
591  m_phy1->SetAttribute("SupportedModes", UanModesListValue(modes));
592 }
593 
594 void
596 {
597  m_phy2->SetAttribute("SupportedModes", UanModesListValue(modes));
598 }
599 
602 {
603  PointerValue perValue;
604  m_phy1->GetAttribute("PerModel", perValue);
605  return perValue;
606 }
607 
610 {
611  PointerValue perValue;
612  m_phy2->GetAttribute("PerModel", perValue);
613  return perValue;
614 }
615 
616 void
618 {
619  m_phy1->SetAttribute("PerModel", PointerValue(per));
620 }
621 
622 void
624 {
625  m_phy2->SetAttribute("PerModel", PointerValue(per));
626 }
627 
630 {
631  PointerValue sinrValue;
632  m_phy1->GetAttribute("SinrModel", sinrValue);
633  return sinrValue;
634 }
635 
638 {
639  PointerValue sinrValue;
640  m_phy2->GetAttribute("SinrModel", sinrValue);
641  return sinrValue;
642 }
643 
644 void
646 {
647  m_phy1->SetAttribute("SinrModel", PointerValue(sinr));
648 }
649 
650 void
652 {
653  m_phy2->SetAttribute("SinrModel", PointerValue(sinr));
654 }
655 
656 void
658 {
659  NS_LOG_DEBUG(Now().As(Time::S) << " Received packet");
660  m_recOkCb(pkt, sinr, mode);
661  m_rxOkLogger(pkt, sinr, mode);
662 }
663 
664 void
666 {
667  m_recErrCb(pkt, sinr);
668  m_rxErrLogger(pkt, sinr, m_phy1->GetMode(0));
669 }
670 
673 {
675  "GetPacketRx not valid for UanPhyDual. Must specify GetPhy1PacketRx or GetPhy2PacketRx");
676  return Create<Packet>();
677 }
678 
679 int64_t
681 {
682  NS_LOG_FUNCTION(this << stream);
683  return 0;
684 }
685 
686 } // namespace ns3
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition: double.h:42
virtual void DoDispose()
Destructor implementation.
Definition: object.cc:352
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
Definition: packet.cc:305
Hold objects of type Ptr<T>.
Definition: pointer.h:37
Hold variables of type string.
Definition: string.h:56
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
@ S
second
Definition: nstime.h:116
a unique identifier for an interface.
Definition: type-id.h:59
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:931
Common packet header fields.
uint8_t GetType() const
Get the header type value.
Mac8Address GetSrc() const
Get the source address.
@ TYPE_DATA
Data.
Definition: uan-mac-rc.h:168
Container for UanTxModes.
Definition: uan-tx-mode.h:259
The power delay profile returned by propagation models.
Default SINR model for UanPhyDual.
Definition: uan-phy-dual.h:40
UanPhyCalcSinrDual()
Constructor.
Definition: uan-phy-dual.cc:49
~UanPhyCalcSinrDual() override
Destructor.
Definition: uan-phy-dual.cc:53
static TypeId GetTypeId()
Register this type.
Definition: uan-phy-dual.cc:58
double CalcSinrDb(Ptr< Packet > pkt, Time arrTime, double rxPowerDb, double ambNoiseDb, UanTxMode mode, UanPdp pdp, const UanTransducer::ArrivalList &arrivalList) const override
Calculate the SINR value for a packet.
Definition: uan-phy-dual.cc:68
Class used for calculating SINR of packet in UanPhy.
Definition: uan-phy.h:44
double DbToKp(double db) const
Convert dB re 1 uPa to kilopascals.
Definition: uan-phy.h:80
double KpToDb(double kp) const
Convert kilopascals to dB re 1 uPa.
Definition: uan-phy.h:91
Two channel Phy.
Definition: uan-phy-dual.h:79
RxOkCallback m_recOkCb
Callback when packet received without errors.
Definition: uan-phy-dual.h:248
Ptr< UanPhy > m_phy1
First Phy layer.
Definition: uan-phy-dual.h:237
UanModesList GetModesPhy2() const
Get the list of available modes.
double GetCcaThresholdPhy1() const
Get the CCA threshold signal strength required to detect channel busy.
void RxOkFromSubPhy(Ptr< Packet > pkt, double sinr, UanTxMode mode)
Handle callback and logger for packets received without error.
bool IsStateRx() override
Ptr< UanChannel > GetChannel() const override
Get the attached channel.
~UanPhyDual() override
Dummy destructor.
void EnergyDepletionHandler() override
Handle the energy depletion event.
Ptr< Packet > GetPhy2PacketRx() const
Get the packet currently being received.
void NotifyIntChange() override
Called when there has been a change in the amount of interference this node is experiencing from othe...
Ptr< UanPhyCalcSinr > GetSinrModelPhy2() const
Get the SINR calculator.
int64_t AssignStreams(int64_t stream) override
Assign a fixed random variable stream number to the random variables used by this model.
void SetPerModelPhy1(Ptr< UanPhyPer > per)
Set the error probability model.
Ptr< UanPhy > m_phy2
Second Phy layer.
Definition: uan-phy-dual.h:239
void SetTxPowerDbPhy1(double txpwr)
Set the transmit power.
void SetModesPhy2(UanModesList modes)
Set the available modes.
bool IsStateCcaBusy() override
UanModesList GetModesPhy1() const
Get the list of available modes.
bool IsStateBusy() override
Ptr< Packet > GetPacketRx() const override
Get the packet currently being received.
void Clear() override
Clear all pointer references.
void SetCcaThresholdDb(double thresh) override
Set the threshold for detecting channel busy.
bool IsStateIdle() override
uint32_t GetNModes() override
Get the number of transmission modes supported by this Phy.
UanTxMode GetMode(uint32_t n) override
Get a specific transmission mode.
double GetCcaThresholdDb() override
Get the CCA threshold signal strength required to detect channel busy.
void SetTransducer(Ptr< UanTransducer > trans) override
Attach a transducer to this Phy.
bool IsStateTx() override
double GetCcaThresholdPhy2() const
Get the CCA threshold signal strength required to detect channel busy.
void SetRxThresholdDb(double thresh) override
Set the minimum SINR threshold to receive a packet without errors.
void SetPerModelPhy2(Ptr< UanPhyPer > per)
Set the error probability model.
void SetChannel(Ptr< UanChannel > channel) override
Attach to a channel.
static TypeId GetTypeId()
Register this type.
void RegisterListener(UanPhyListener *listener) override
Register a UanPhyListener to be notified of common UanPhy events.
double GetRxThresholdDb() override
Get the minimum received signal strength required to receive a packet without errors.
bool IsStateSleep() override
void SetSinrModelPhy2(Ptr< UanPhyCalcSinr > calcSinr)
Set the SINR calculator.
ns3::TracedCallback< Ptr< const Packet >, double, UanTxMode > m_rxErrLogger
A packet was received unsuccessfuly.
Definition: uan-phy-dual.h:244
void SetModesPhy1(UanModesList modes)
Set the available modes.
Ptr< UanPhyPer > GetPerModelPhy2() const
Get the error probability model.
double GetTxPowerDb() override
Get the current transmit power, in dB.
UanPhyDual()
Constructor.
ns3::TracedCallback< Ptr< const Packet >, double, UanTxMode > m_rxOkLogger
A packet was received successfully.
Definition: uan-phy-dual.h:242
void NotifyTransStartTx(Ptr< Packet > packet, double txPowerDb, UanTxMode txMode) override
Called when a transmission is beginning on the attached transducer.
Ptr< UanPhyPer > GetPerModelPhy1() const
Get the error probability model.
void SendPacket(Ptr< Packet > pkt, uint32_t modeNum) override
Send a packet using a specific transmission mode.
void SetMac(Ptr< UanMac > mac) override
Set the MAC forwarding messages to this Phy.
void SetDevice(Ptr< UanNetDevice > device) override
Set the device hosting this Phy.
double GetTxPowerDbPhy2() const
Get the current transmit power, in dB.
void SetEnergyModelCallback(DeviceEnergyModel::ChangeStateCallback callback) override
Set the DeviceEnergyModel callback for UanPhy device.
void DoDispose() override
Destructor implementation.
void RxErrFromSubPhy(Ptr< Packet > pkt, double sinr)
Handle callback and logger for packets received with error.
void SetTxPowerDb(double txpwr) override
Set the transmit power.
void EnergyRechargeHandler() override
Handle the energy recharge event.
RxErrCallback m_recErrCb
Callback when packet received with errors.
Definition: uan-phy-dual.h:250
double GetTxPowerDbPhy1() const
Get the current transmit power, in dB.
void SetCcaThresholdPhy1(double thresh)
Set the threshold for detecting channel busy.
Ptr< UanTransducer > GetTransducer() override
Get the attached transducer.
void SetReceiveErrorCallback(RxErrCallback cb) override
Set the callback to be used when a packet is received with errors.
ns3::TracedCallback< Ptr< const Packet >, double, UanTxMode > m_txLogger
A packet was sent from this Phy.
Definition: uan-phy-dual.h:246
void SetSinrModelPhy1(Ptr< UanPhyCalcSinr > calcSinr)
Set the SINR calculator.
void SetTxPowerDbPhy2(double txpwr)
Set the transmit power.
Ptr< Packet > GetPhy1PacketRx() const
Get the packet currently being received.
Ptr< UanNetDevice > GetDevice() const override
Get the device hosting this Phy.
void SetCcaThresholdPhy2(double thresh)
Set the threshold for detecting channel busy.
void SetReceiveOkCallback(RxOkCallback cb) override
Set the callback to be used when a packet is received without error.
void StartRxPacket(Ptr< Packet > pkt, double rxPowerDb, UanTxMode txMode, UanPdp pdp) override
Packet arriving from channel: i.e.
Ptr< UanPhyCalcSinr > GetSinrModelPhy1() const
Get the SINR calculator.
static UanModesList GetDefaultModes()
Get the default transmission modes.
Definition: uan-phy-gen.cc:567
Base class for UAN Phy models.
Definition: uan-phy.h:178
Interface for PHY event listener.
Definition: uan-phy.h:145
std::list< UanPacketArrival > ArrivalList
List of arriving packets overlapping in time.
Abstraction of packet modulation information.
Definition: uan-tx-mode.h:43
@ OTHER
Unspecified/undefined.
Definition: uan-tx-mode.h:56
uint32_t GetBandwidthHz() const
Get the transmission signal bandwidth.
Definition: uan-tx-mode.cc:64
std::string GetName() const
Get the mode name.
Definition: uan-tx-mode.cc:76
ModulationType GetModType() const
Get the modulation type of the mode.
Definition: uan-tx-mode.cc:40
uint32_t GetCenterFreqHz() const
Get the transmission center frequency.
Definition: uan-tx-mode.cc:58
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:179
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:268
#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.
Definition: log.h:261
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:46
Time Now()
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:305
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 AttributeAccessor > MakePointerAccessor(T1 a1)
Definition: pointer.h:227
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Definition: double.h:43
channel
Definition: third.py:88
mac
Definition: third.py:92