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
41namespace ns3
42{
43
44NS_LOG_COMPONENT_DEFINE("UanPhyDual");
45
47NS_OBJECT_ENSURE_REGISTERED(UanPhyCalcSinrDual);
48
50{
51}
52
54{
55}
56
59{
60 static TypeId tid = TypeId("ns3::UanPhyCalcSinrDual")
62 .SetGroupName("Uan")
63 .AddConstructor<UanPhyCalcSinrDual>();
64 return tid;
65}
66
67double
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 UanTransducer::ArrivalList::const_iterator 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 {
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
143void
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
158void
160{
161 Clear();
163}
164
165TypeId
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.",
203 MakeUanModesListAccessor(&UanPhyDual::GetModesPhy1, &UanPhyDual::SetModesPhy1),
204 MakeUanModesListChecker())
205 .AddAttribute(
206 "SupportedModesPhy2",
207 "List of modes supported by Phy2.",
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 unsuccessfully.",
242 "ns3::UanPhy::TracedCallback")
243 .AddTraceSource("Tx",
244 "Packet transmission beginning.",
246 "ns3::UanPhy::TracedCallback")
247
248 ;
249
250 return tid;
251}
252
253void
255{
256 NS_LOG_DEBUG("Not Implemented");
257}
258
259void
261{
262 NS_LOG_DEBUG("Not Implemented");
263}
264
265void
267{
268 NS_LOG_DEBUG("Not Implemented");
269}
270
271void
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
289void
291{
292 m_phy1->RegisterListener(listener);
293 m_phy2->RegisterListener(listener);
294}
295
296void
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
305void
307{
308 m_phy1->SetReceiveOkCallback(cb);
309 m_phy2->SetReceiveOkCallback(cb);
310}
311
312void
314{
315 m_phy1->SetReceiveErrorCallback(cb);
316 m_phy2->SetReceiveErrorCallback(cb);
317}
318
319void
321{
322 m_phy1->SetTxPowerDb(txpwr);
323 m_phy2->SetTxPowerDb(txpwr);
324}
325
326void
328{
329 m_phy1->SetTxPowerDb(txpwr);
330}
331
332void
334{
335 m_phy2->SetTxPowerDb(txpwr);
336}
337
338void
340{
341 m_phy1->SetRxThresholdDb(thresh);
342 m_phy2->SetRxThresholdDb(thresh);
343}
344
345void
347{
348 m_phy1->SetCcaThresholdDb(thresh);
349 m_phy2->SetCcaThresholdDb(thresh);
350}
351
352void
354{
355 m_phy1->SetCcaThresholdDb(thresh);
356}
357
358void
360{
361 m_phy2->SetCcaThresholdDb(thresh);
362}
363
364double
366{
367 NS_LOG_WARN("Warning: Dual Phy only returns TxPowerDb of Phy 1");
368 return m_phy1->GetTxPowerDb();
369}
370
371double
373{
374 return m_phy1->GetTxPowerDb();
375}
376
377double
379{
380 return m_phy2->GetTxPowerDb();
381}
382
383double
385{
386 return m_phy1->GetRxThresholdDb();
387}
388
389double
391{
392 NS_LOG_WARN("Dual Phy only returns CCAThreshold of Phy 1");
393 return m_phy1->GetCcaThresholdDb();
394}
395
396double
398{
399 return m_phy1->GetCcaThresholdDb();
400}
401
402double
404{
405 return m_phy2->GetCcaThresholdDb();
406}
407
408bool
410{
411 return m_phy1->IsStateIdle();
412}
413
414bool
416{
417 return m_phy2->IsStateIdle();
418}
419
420bool
422{
423 return m_phy1->IsStateRx();
424}
425
426bool
428{
429 return m_phy2->IsStateRx();
430}
431
432bool
434{
435 return m_phy1->IsStateTx();
436}
437
440{
441 return m_phy1->GetPacketRx();
442}
443
446{
447 return m_phy2->GetPacketRx();
448}
449
450bool
452{
453 return m_phy2->IsStateTx();
454}
455
456bool
458{
459 return m_phy1->IsStateSleep() && m_phy2->IsStateSleep();
460}
461
462bool
464{
465 return m_phy1->IsStateIdle() && m_phy2->IsStateIdle();
466}
467
468bool
470{
471 return !IsStateIdle() || !IsStateSleep();
472}
473
474bool
476{
477 return m_phy1->IsStateRx() || m_phy2->IsStateRx();
478}
479
480bool
482{
483 return m_phy1->IsStateTx() || m_phy2->IsStateTx();
484}
485
486bool
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
504void
506{
507 m_phy1->SetChannel(channel);
508 m_phy2->SetChannel(channel);
509}
510
511void
513{
514 m_phy1->SetDevice(device);
515 m_phy2->SetDevice(device);
516}
517
518void
520{
521 m_phy1->SetMac(mac);
522 m_phy2->SetMac(mac);
523}
524
525void
527 double /* txPowerDb */,
528 UanTxMode /* txMode */)
529{
530}
531
532void
534{
535 m_phy1->NotifyIntChange();
536 m_phy2->NotifyIntChange();
537}
538
539void
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
555{
556 return m_phy1->GetNModes() + m_phy2->GetNModes();
557}
558
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
588void
590{
591 m_phy1->SetAttribute("SupportedModes", UanModesListValue(modes));
592}
593
594void
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
616void
618{
619 m_phy1->SetAttribute("PerModel", PointerValue(per));
620}
621
622void
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
644void
646{
647 m_phy1->SetAttribute("SinrModel", PointerValue(sinr));
648}
649
650void
652{
653 m_phy2->SetAttribute("SinrModel", PointerValue(sinr));
654}
655
656void
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
664void
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
679int64_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:353
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:60
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:935
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
AttributeValue implementation for UanModesList.
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:43
double DbToKp(double db) const
Convert dB re 1 uPa to kilopascals.
Definition: uan-phy.h:79
double KpToDb(double kp) const
Convert kilopascals to dB re 1 uPa.
Definition: uan-phy.h:90
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 unsuccessfully.
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:177
Interface for PHY event listener.
Definition: uan-phy.h:144
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
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Definition: double.h:43
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
Definition: pointer.h:231
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:160
#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:296
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.
channel
Definition: third.py:81
mac
Definition: third.py:85